为什么Go中的函数类型转换失败



上下文:我试图将类型func(*interface{}) bool转换为类型func(*string) bool,但遇到编译错误。Go抱怨类型转换不可能,但没有解释原因。最小重复如下:

代码:

type strIterFn func(*string) bool
func someFactory (_ []interface{}) func(*interface{}) bool {
return func(_ *interface{}) bool { return true }
}
func main() {
strs := []interface{}{"hello", "world"}
strIterFn(someFactory(strs)) // --> this line fails to compile
}

游乐场:https://play.golang.org/p/oOSy50j_tKw

因为Go中没有类型协方差。

在Go常见问题解答中,它解释道:

Can I convert a []T to an []interface{}?

不直接。语言规范不允许使用它,因为
这两种类型在内存中没有相同的表示形式。是的将元素单独复制到目的切片所必需的。

这是对切片的解释,但对函数的解释是一样的。


此外,我发现您的代码示例很奇怪。为什么需要*interface{}?需要一个指向接口的指针是一个相当深奥的用例。

也许正确的方法是重新设计?如果你能描述你试图解决的实际问题,可能会有其他解决方案。

最新更新