我试图从同一映射中定义的另一个函数调用在映射中定义的函数。但是Go编译器说:“初始化循环”。这是代码:
package main
import ...
var calls = map[string]func(arg string) (interface[], error) {
"function1": func(arg string) (interface{}, error) {
// do stuff
return res, nil
},
"function2": func(arg string) (interface{}, error) {
res, error := calls["function1"](arg) // HERE IS THE ERROR
return res, nil
},
}
如何从映射中调用其他函数?-- var调用,不在函数中。
发布于 2020-06-28 03:05:46
在修改代码以便它甚至可以编译(即用interface[]
替换interface{}
,并删除一些未定义的变量等)之后,实际的错误与初始化循环无关。确切的错误实际上是(参见操场实例):
./10.10:10:25:未定义:呼叫
(如果您实际上收到了一个有关初始化循环的错误,而不是这个,这可能意味着您粘贴的代码实际上与实际代码不够接近,所以请用最小的,可复制的例子更新这个问题。)
解决这一问题的方法是在定义引用它的函数之前定义calls
。通过将calls
预定义为空映射(操场链接)很容易做到这一点:
calls := make(map[string]func(string) (interface{}, error), 0 )
calls = map[string]func(arg string) (interface{}, error) {
"function1": func(arg string) (interface{}, error) {
// do stuff
return nil, nil
},
"function2": func(arg string) (interface{}, error) {
res, err := calls["function1"](arg) // HERE IS THE ERROR
return res, err
},
}
发布于 2020-06-27 23:50:48
这是因为在映射初始化的范围内,还没有分配“调用”映射。您可以按以下方式获得它:
f1 := func(arg string) (interface{}, error) {
// do stuff
return nil, nil
}
var calls = map[string]func(arg string) (interface{}, error) {
"function1": f1,
"function2": func(arg string) (interface{}, error) {
res, error := f1(arg)
return res, nil
},
}
这样,您就不需要在作用域中有'calls‘映射来获得'f1’值。
https://stackoverflow.com/questions/62617335
复制