我已经声明了一个新类型func,该新类型需要符合的任何值interface{}。但是,当我调用已作为参数传递的函数(符合该类型规范)时,会出现错误。
func
interface{}
有人可以解释为什么会这样吗?以下是我可以重新创建问题的最简单示例。
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 }
您在这里寻找的概念是类型系统中的 差异 。某些类型的系统和类型支持 协方差 和 逆变 ,但围棋的接口不。
虽然int可以将an 传递给Expect的函数interface{},但关于func(int)和不能说相同func(interface{}),因为接口的行为不协变。
int
func(int)
func(interface{})
如果type x实现接口ii,则并不意味着func(x)实现func(ii)。
x
ii
func(x)
func(ii)
您可以做的是传递给func(int)Expect的函数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)int
除了答案顶部的Wikipedia链接之外,此文章还提供了有关各种差异编程语言支持的更多详细信息。它主要使用其他语言,因为方差最好用支持继承的语言来证明。