写入将匿名函数作为参数传递的高阶函数 [closed]

Write higher-order function that is passed an anonymous function as parameter [closed]

提问人:devinbost 提问时间:9/5/2019 最后编辑:devinbost 更新时间:9/5/2019 访问量:463

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

4年前关闭。

以下是重现此代码的方法: 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")
    }()

但是,我得到:

赋值不匹配:1 个变量,但 func 文本返回 2 个值

(作为参考,返回 .)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:赋值不匹配:1 个变量,但 func 字面量 返回 2 个值 ./main.go:248:15:不能使用 func literal (type func() ([]byte, error)) 作为返回参数中的类型错误: func() ([]byte, error) 不实现 error(缺少 Error 方法)

我是否可以用 Go 做我想做的事情?

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

{
    "nfsURLBase" : "http://example.url.path.com/",
    "nfsFsBase" : "/data/nfs/path/to/files"
}
Go lambda 闭包 anonymous-function higher-order-functions

评论

4赞 Cerise Limón 9/5/2019
第一个代码段尝试将调用匿名函数的结果分配给 。编译器报告错误,因为函数返回两个值,但赋值中只有一个变量。通过删除尾随 .删除 parens 后,代码段将匿名函数分配给变量 。getNfsConfigsFunc()getNfsConfigsFunc

答:

1赞 user10753492 9/5/2019 #1

这个东西

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

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

它应该只是:

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