为了账号安全,请及时绑定邮箱和手机立即绑定

在参数中接受具有空接口返回类型的函数

在参数中接受具有空接口返回类型的函数

Go
汪汪一只猫 2021-11-01 17:25:19
我想了解为什么下面的代码片段无法编译。接受函数作为可能具有任何返回类型的函数参数的 Go 方式是什么?package mainfunc main() {    test(a) // Error: cannot use a (type func() string) as type func() interface {} in argument to test    test(b) // Error: cannot use b (type func() int) as type func() interface {} in argument to test}func a() string {    return "hello"}func b() int {    return 1}func test(x func() interface{}) {    // some code...    v := x()    // some more code....}播放:https : //play.golang.org/p/CqbuEZGy12我的解决方案基于 Volker 的回答:package mainimport (    "fmt")func main() {    // Wrap function a and b with an anonymous function    // that has an empty interface return type. With this    // anonymous function, the call signature of test    // can be satisfied without needing to modify the return    // type of function a and b.    test(func() interface{} {        return a()    })    test(func() interface{} {        return b()    })}func a() string {     return "hello"}func b() int {    return 1}func test(x func() interface{}) {    v := x()    fmt.Println(v)  }播放:https : //play.golang.org/p/waOGBZZwN7
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

你绊倒了围棋新人一个非常普遍的误解:空接口interface{}并不能意味着“任何类型”。真的,它没有。Go 是静态类型的。空接口interface {}是一个实际的(强类型类型),如 eg stringor struct{Foo int}or interface{Explode() bool}。


这意味着如果某物具有该类型,interface{}则它具有该类型而不是“任何类型”。


你的职能


func test(x func() interface{})

接受一个参数。此参数是一个(无参数函数),它返回一个特定类型,即 type interface{}。您可以传递test与此签名匹配的任何函数:“无参数并返回interface{}”。您的任何功能都a与b此签名不匹配。


如上所述:interface {}不是“whatever”的神奇缩写,它是一种独特的静态类型。


您必须将例如 a 更改为:


func a() interface{} {

    return "hello"

}

现在这可能看起来很奇怪,因为您返回 astring不是 type interface{}。这是有效的,因为任何类型都可以分配给类型的变量interface{}(因为每种类型至少没有方法:-)。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信