登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-06 06:46:29 317浏览 收藏

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

问题内容

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

正确答案

您在这里寻找的概念是类型系统中的变 。一些类型系统和类型支持 协变逆变 ,但 Go 的接口不支持。

虽然int可以将 an 传递给期望 的函数,interface{}但不能对func(int)and说同样的话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{}


除了答案顶部的 Wikipedia 链接之外,[这篇文章](https://eli.thegreenplace.net/2018/covariance- and-contravariance-in- subtyping/)还提供了有关不同类型的方差编程语言支持的更多详细信息。它主要使用其他语言,因为支持继承的语言最好地展示了差异。

今天关于《类型 func 与接口参数不兼容错误》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

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