类型 func 出现接口参数不兼容错误
问题:
调用作为参数传递的函数时对于采用符合 interface{} 的值的类型 func,会遇到错误。例如,在以下代码中:
type myfunc func(x interface{}) func a(num int) { } func b(f myfunc) { f(2) } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b }
解释:
此错误源于 Go 的类型系统缺乏对其差异的支持。方差是指在参数参数中使用子类型和超类型的灵活性。与其他类型系统不同,Go 的接口不支持方差。
在给定的示例中,虽然 int 可以传递给接受 interface{} 的函数,但这并不能扩展到兼容 func(int)与 func(interface{}) 一起使用。这是因为 Go 中的接口不是协变的。
解决方案:
作为一种解决方法,可以通过匿名函数实现 interface{} 来将函数传递给需要 interface{} 的函数:
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(func(n int) int { return n + 2 }) }
这种方法利用了 func(int)int 确实实现的事实接口{}。
要进一步了解编程语言的方差,请考虑浏览维基百科文章和下面链接的帖子:
以上是为什么 Go 的类型系统在传递带接口参数的函数时会产生'不兼容错误”?的详细内容。更多信息请关注PHP中文网其他相关文章!