首页 >后端开发 >Golang >为什么 Go 的类型系统在传递带接口参数的函数时会产生'不兼容错误”?

为什么 Go 的类型系统在传递带接口参数的函数时会产生'不兼容错误”?

Linda Hamilton
Linda Hamilton原创
2025-01-01 12:21:10486浏览

Why Does Go's Type System Produce

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

问题:
调用作为参数传递的函数时对于采用符合 interface{} 的值的类型 func,会遇到错误。例如,在以下代码中:

type myfunc func(x interface{})

func a(num int) {
}

func b(f myfunc) {
    f(2)
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
}

解释:
此错误源于 Go 的类型系统缺乏对其差异的支持。方差是指在参数参数中使用子类型和超类型的灵活性。与其他类型系统不同,Go 的接口不支持方差。

在给定的示例中,虽然 int 可以传递给接受 interface{} 的函数,但这并不能扩展到兼容 func(int)与 func(interface{}) 一起使用。这是因为 Go 中的接口不是协变的。

解决方案:
作为一种解决方法,可以通过匿名函数实现 interface{} 来将函数传递给需要 interface{} 的函数:

package main

import "fmt"

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

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

func main() {
    foo(func(n int) int {
        return n + 2
    })
}

这种方法利用了 func(int)int 确实实现的事实接口{}。

要进一步了解编程语言的方差,请考虑浏览维基百科文章和下面链接的帖子:

  • [方差(计算机科学)](https:/ /en.wikipedia.org/wiki/Variance_(computer_science))
  • [通用方差编程](https://www. Fluentcpp.com/2018/11/29/variance-in-generic-programming/)

以上是为什么 Go 的类型系统在传递带接口参数的函数时会产生'不兼容错误”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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