首页 >后端开发 >Golang >为什么 Go 将特定参数类型的函数传递给接受 Interface{} 参数的函数时会报告错误?

为什么 Go 将特定参数类型的函数传递给接受 Interface{} 参数的函数时会报告错误?

DDD
DDD原创
2024-12-25 13:03:10464浏览

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

接口参数不兼容的类型 Func

当定义接受任何符合接口的值的函数类型时,可能会遇到令人困惑的情况调用似乎与该规范匹配的函数时出错。

考虑以下内容例如:

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
}

出现错误是因为 Go 中的接口表现出 不变性,这意味着虽然 int 可以传递给需要接口{}的函数,但对于func(int) 和 func(interface{})。

在 Go 中,类型兼容的函数必须具有相同的参数和返回类型。由于 func(int) 和 func(interface{}) 不满足此要求,Go 认为它们不兼容。

要解决此问题,请考虑使用以下方法:

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)int 实现了 interface{},这要求它具有指定输入和返回类型的单个方法。

有关 Go 中方差的更详细说明,请参阅 Wikipedia 文章主题和所提供答案中链接的博客文章。

以上是为什么 Go 将特定参数类型的函数传递给接受 Interface{} 参数的函数时会报告错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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