我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么?
package main func 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 main import ( "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
你绊倒了围棋新人一个非常普遍的误解:空接口interface{}并 不能 意味着“任何类型”。确实不是。Go是静态类型的。空接口interface {}是实际的(强类型),例如string或struct{Foo int}或interface{Explode() bool}。
interface{}
interface {}
string
struct{Foo int}
interface{Explode() bool}
这意味着如果某物具有该类型,interface{}则它具有该类型而不是“任何类型”。
您的职能
func test(x func() interface{})
接受一个参数。此参数是一个(无参数函数),它返回特定类型type interface{}。您可以将test与此签名匹配的任何函数传递给它:“无参数并返回interface{}”。没有您的功能a并且b匹配此签名。
test
a
b
如上所述:interface {}“ whatever”不是“ whatever”的神奇缩写,它是一种独特的静态类型。
您必须将例如a更改为:
func a() interface{} { return "hello" }
现在,当您返回string不是type的a时,这可能看起来很奇怪interface{}。之所以可行,是因为任何类型都可以分配给该类型的变量interface{}(因为每种类型至少都没有方法:-)。