猿问

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

我想了解为什么下面的代码片段无法编译。接受函数作为可能具有任何返回类型的函数参数的 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


汪汪一只猫
浏览 194回答 2
2回答

慕村9548890

你绊倒了围棋新人一个非常普遍的误解:空接口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{}(因为每种类型至少没有方法:-)。
随时随地看视频慕课网APP

相关分类

Go
我要回答