登录
首页 >  Golang >  Go问答

接口参数不兼容错误可能发生在类型 fun 上

来源:stackoverflow

时间:2024-03-12 23:30:26 273浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《接口参数不兼容错误可能发生在类型 fun 上》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我已经声明了一个新类型 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
}

解决方案


您在此处查找的概念是 variance in the type system。某些类型系统和类型支持协变逆变,但 go 的接口不支持。

虽然 int 可以传递给需要 interface{} 的函数,但对于 func(int)func(interface{}) 却不能这样说,因为接口的行为不协变。

如果类型 x 实现了接口 ii,并不意味着 func(x) 实现了 func(ii)

您可以做的是将 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{}

除了答案顶部的维基百科链接之外,this post 还提供了有关不同类型方差编程语言支持的更多详细信息。它主要使用其他语言,因为通过支持继承的语言可以最好地展示差异。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>