go - 编写传递匿名函数作为参数的高阶函数

标签 go lambda closures anonymous-function higher-order-functions

<分区>

重现此代码的方法如下:https://play.golang.org/p/ostuT1QFV4C **

我正在尝试编写一个函数,允许我传递用于获取数据并将其转换为字符串的任何方法。这是为了更好地理解如何在 Go 中使用高阶函数的尝试。

func getConfigsFunc(getData func() ([]byte, error)) string {
    b, err := getData()
    if err != nil {
        fmt.Print(err)
    }
    str := string(b) // convert content to a 'string'
    return str
}

我尝试过以几种不同的方式使用此功能,但没有一种能正常工作。

例如,在我可能会使用它的一种情况下,我可以构造一个匿名函数,它围绕一个变量关闭并返回一个不接受任何参数并返回 ([]byte, error)。从理论上讲,只要我可以返回不接受任何参数并返回 ([]byte, error) 的匿名方法,这种方法就允许我包装任何获取数据的代码。

但是,我尝试实现它却失败了。

首先,我尝试了这个:

getNfsConfigsFunc := func() ([]byte, error) {
        return ioutil.ReadFile("nfsConfigs.json")
    }()

但是,我得到:

assignment mismatch: 1 variable but func literal returns 2 values

(作为引用,ioutil.ReadFile(..) 返回 ([]byte, error)。)

我假设(可能是错误的)我的错误意味着匿名函数正在立即执行(就像 Javascript 中的 IIFE),所以我尝试将内部部分包装在一个函数中(试图强制匿名函数返回一个函数,而不是 2 个值),像这样:

getNfsConfigsFunc := func() ([]byte, error) {
        return nil, func() ([]byte, error) {
            return ioutil.ReadFile("nfsConfigs.json")
        }
    }()

但是 IDE 强制我将“nil,”添加到匿名函数的一部分,这似乎违反了我打算做的事情(除非我误解了什么)。无论如何,它给了我这个错误:

./main.go:247:20: assignment mismatch: 1 variable but func literal returns 2 values ./main.go:248:15: cannot use func literal (type func() ([]byte, error)) as type error in return argument: func() ([]byte, error) does not implement error (missing Error method)

我可以用 Go 做我想做的事吗?

为了完整起见,nfsConfigs.json 的内容如下所示:

{
    "nfsURLBase" : "http://example.url.path.com/",
    "nfsFsBase" : "/data/nfs/path/to/files"
}

最佳答案

这件事

getNfsConfigsFunc := func() ([]byte, error) {
        return ioutil.ReadFile("nfsConfigs.json")
}()

不创建匿名函数。它调用匿名函数,因为训练()

应该是:

getNfsConfigsFunc := func() ([]byte, error) {
        return ioutil.ReadFile("nfsConfigs.json")
}

关于go - 编写传递匿名函数作为参数的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797589/

相关文章:

go - Go 语言中的 nil slice vs 非 nil slice vs 空 slice

api - 如何在Golang中从服务器发送Websocket

c# - 如何在以后设置属性值

pointers - 具有混合返回/签名类型的 Go 函数

go - 为什么 `go get` 在 Travis CI 构建中开始失败?

java - 检查映射中的键是否与Java中的List内容匹配

c# - 带有内部 Lambda 表达式的 Lambda 表达式

javascript - 这个关闭是如何运作的?

java - 如何像 Java 接口(interface)一样在 swift 中使用闭包

ios - 如何修复上下文闭包类型 '((String, JSON), (String, JSON)) -> Bool' 需要 2 个参数,但在闭包主体中使用了 1 个?