go - Go 中的高级函数

标签 go

这个问题在这里已经有了答案:





cannot use function (type func()) as type in argument

(1 个回答)


2年前关闭。




给定以下 Go 代码

type fType = func(interface{}) (*interface{}, error)

func f1(arg interface{}, fun fType) *interface{} {
    r, _ := fun(arg)
    return r
}

func f2(path string) {
    r := f1(path, os.Open) //error
}


我在最后一行得到错误。错误是:

cannot use os.Open (type func(string) (*os.File, error)) as type func(interface {}) (*interface {}, error) in argument to f1



作为更多信息,在 Visual Studio 代码屏幕截图下方:

enter image description here

我的错误是什么?

编辑
如果我用一系列丑陋的转换阻塞 f2,则代码编译时不会出错。有没有更简洁优雅的方式来实现同样的目标?
func f2(path string) {
    var itfPath interface{}
    itfPath = path
    osOpen := func(p interface{}) (*interface{}, error) {
        var path string
        path = p.(string)
        file, err := os.Open(path)
        var fil interface{}
        fil = file
        return &fil, err
    }
    r := f1(itfPath, osOpen)
}

最佳答案

错误是 os.Open 是 func(string)(*os.File,error) ,而不是 func(interface{}) (*interface{},error) .一般来说,如果 func(interface{})是必需的,您不能通过 func(someOtherType) ,仅仅是因为类型签名不匹配。调用函数获取/返回 interface{} 的机制与获取非接口(interface)类型的函数不同。

关于go - Go 中的高级函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60574854/

相关文章:

go - 将 map 作为值传递到 Cassandra 中

go - 使用 apimachinery/client-go 检索不包含标签的 kubernetes 节点

go - 如何在 http.Request 中获取 URL

go - 如何测试二进制字符串是否有效的UTF8?

reflection - 为什么可以使用反射在 slice 中设置值?

go - 如何使用Travis CI从多个构建矩阵创建github发布?

go - 为什么这个例子可能不退出?

mongodb - Mgo 拉取更新不起作用

linux - 在 linux 系统上从 golang 中的 xls 文件中读取值

rest - 如何使用证书 golang 发送 https 请求