首页 >后端开发 >Golang >尽管 `int` 满足 `interface{}`,为什么 Go 不允许将 `func(int)` 传递给 `func(interface{})`?

尽管 `int` 满足 `interface{}`,为什么 Go 不允许将 `func(int)` 传递给 `func(interface{})`?

Barbara Streisand
Barbara Streisand原创
2024-12-29 18:41:11622浏览

Why Doesn't Go Allow Passing `func(int)` to `func(interface{})` Despite `int` Satisfying `interface{}`?

类型 func 出现接口参数不兼容错误

在 Go 中,声明一个类型函数来接受任何符合 interface{} 的值看起来很简单。但是,调用作为遵循此类型规范的参数传递的函数会引发错误。

此错误源于类型方差的概念,特别是 Go 接口中缺乏协方差。虽然整数 (int) 可以传递给需要 interface{} 的函数,但同样的原则不适用于函数。

具体来说,func(int) 和 func(interface{}) 不是兼容的类型。尽管 int 符合 interface{},但 func(int) 不符合 func(interface{})。这是因为 Go 中的接口是不变的。

要解决此问题,请考虑将 func(int) 传递给需要 interface{} 的函数,如以下示例所示:

package main

import "fmt"

type myfunc interface{}

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

在这个例子中,func(int)int实现了interface{},从而避免了类型不兼容的错误。

以上是尽管 `int` 满足 `interface{}`,为什么 Go 不允许将 `func(int)` 传递给 `func(interface{})`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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