【发布时间】:2020-01-07 21:21:52
【问题描述】:
重现此代码的方法如下: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: assignment mismatch: 1 variable but func literal 返回 2 个值 ./main.go:248:15: 不能使用 func 字面量(类型 func() ([]byte, error)) 作为返回参数中的类型错误: func() ([]byte, error) 没有实现错误(缺少Error方法)
我可以用 Go 做我想做的事情吗?
为了完整起见,nfsConfigs.json 的内容如下所示:
{
"nfsURLBase" : "http://example.url.path.com/",
"nfsFsBase" : "/data/nfs/path/to/files"
}
【问题讨论】:
-
第一个 sn-p 尝试将调用匿名函数的结果分配给
getNfsConfigsFunc。编译器报告错误,因为函数返回两个值,但赋值中只有一个变量。通过删除尾随()来修复代码。去掉括号后,sn-p 将匿名函数分配给变量getNfsConfigsFunc。
标签: go lambda closures anonymous-function higher-order-functions