我想了解为什么下面的代码片段无法编译。接受函数作为可能具有任何返回类型的函数参数的 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{}(因为每种类型至少没有方法:-)。
- 2 回答
- 0 关注
- 184 浏览
添加回答
举报
0/150
提交
取消