类型 func 与接口参数不兼容:理解方差
在 Go 中,遇到“cannot use a (type func(int)) as type myfunc in argument to b" 使用接口参数调用函数时出现的错误可能会令人困惑。这个问题的出现是由于类型系统中方差的概念。
Go 的接口不表现出方差,这意味着接口的行为不像其他编程语言那样具有协变性。当类型 x 实现接口 ii 时,并不意味着 func(x) 实现 func(ii)。
在提供的示例中,发生错误是因为 func(int) 与 func(interface{ }),尽管 int 可分配给接口{}。这种不兼容性是由于 Go 中接口的行为不协变而引起的。
要解决此问题,您可以将 func(int) 传递到需要 interface{} 的函数中,如以下示例所示:
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(add2) }
这是有效的,因为 func(int)int 实现了 interface{},有效地将类型“扩展”为更通用的接口类型。
有关进一步说明,请参阅提供的有关方差的维基百科文章以及探索各种编程语言(尤其是支持继承的语言)中的方差的链接博客文章。
以上是为什么我不能将 `func(int)` 传递给 Go 中需要 `func(interface{})` 的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!