一尘不染

键入func且接口参数不兼容错误

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
}

阅读 173

收藏
2020-07-02

共1个答案

一尘不染

您在这里寻找的概念是类型系统中的
差异

。某些类型的系统和类型支持 协方差逆变 ,但围棋的接口不。

虽然int可以将an
传递给Expect的函数interface{},但关于func(int)和不能说相同func(interface{}),因为接口的行为不协变。

如果type 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{}


除了答案顶部的Wikipedia链接之外,此文章还提供了有关各种差异编程语言支持的更多详细信息。它主要使用其他语言,因为方差最好用支持继承的语言来证明。

2020-07-02