首页 >后端开发 >Golang >为什么我不能将 `func(int)` 传递给 Go 中需要 `func(interface{})` 的函数?

为什么我不能将 `func(int)` 传递给 Go 中需要 `func(interface{})` 的函数?

Susan Sarandon
Susan Sarandon原创
2024-12-23 16:09:12525浏览

Why Can't I Pass a `func(int)` to a Function Expecting `func(interface{})` in Go?

类型 func 与接口参数不兼容:理解方差

在 Go 中,遇到“cannot use a (type func(int)) as type myfunc in argument to b" 使用接口参数调用函数时出现的错误可能会令人困惑。这个问题的出现是由于类型系统中方差的概念。

Go 的接口不表现出方差,这意味着接口的行为不像其他编程语言那样具有协变性。当类型 x 实现接口 ii 时,并不意味着 func(x) 实现 func(ii)。

在提供的示例中,发生错误是因为 func(int) 与 func(interface{ }),尽管 int 可分配给接口{}。这种不兼容性是由于 Go 中接口的行为不协变而引起的。

要解决此问题,您可以将 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{},有效地将类型“扩展”为更通用的接口类型。

有关进一步说明,请参阅提供的有关方差的维基百科文章以及探索各种编程语言(尤其是支持继承的语言)中的方差的链接博客文章。

以上是为什么我不能将 `func(int)` 传递给 Go 中需要 `func(interface{})` 的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn