具有接口参数不兼容错误的Golang类型的func

时间:2019-02-18 10:13:05

标签: go

我已经声明了一个新类型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
}

1 个答案:

答案 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还提供了有关各种变体编程语言支持的更多详细信息。它主要使用其他语言,因为方差最好用支持继承的语言来证明。