我已经声明了一个新类型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
}
答案 0 :(得分:1)
您在这里寻找的概念是variance in the type system。某些类型系统和类型支持协方差和 contravariance ,但是Go的接口不支持。
虽然可以将int
传递给期望interface{}
的函数,但是对于func(int)
和func(interface{})
却不能这样说,因为接口的行为不协变。 / p>
如果类型x
实现了接口ii
,则并不意味着func(x)
实现了func(ii)
。
您可以做的是将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{}
。
除了答案顶部的Wikipedia链接外,this post还提供了有关各种变体编程语言支持的更多详细信息。它主要使用其他语言,因为方差最好用支持继承的语言来证明。