接口参数不兼容的类型 Func
当定义接受任何符合接口的值的函数类型时,可能会遇到令人困惑的情况调用似乎与该规范匹配的函数时出错。
考虑以下内容例如:
type myfunc func(x interface{}) func a(num int) { return } func b(f myfunc) { f(2) return } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b return }
出现错误是因为 Go 中的接口表现出 不变性,这意味着虽然 int 可以传递给需要接口{}的函数,但对于func(int) 和 func(interface{})。
在 Go 中,类型兼容的函数必须具有相同的参数和返回类型。由于 func(int) 和 func(interface{}) 不满足此要求,Go 认为它们不兼容。
要解决此问题,请考虑使用以下方法:
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)int 实现了 interface{},这要求它具有指定输入和返回类型的单个方法。
有关 Go 中方差的更详细说明,请参阅 Wikipedia 文章主题和所提供答案中链接的博客文章。
以上是为什么 Go 将特定参数类型的函数传递给接受 Interface{} 参数的函数时会报告错误?的详细内容。更多信息请关注PHP中文网其他相关文章!