我想将我的所有命令包含在一个映射中,并将命令映射到一个执行该工作的函数(只是一个标准调度表)。我从以下代码开始:
package main
import "fmt"
func hello() {
fmt.Print("Hello World!")
}
func list() {
for key, _ := range whatever {
fmt.Print(key)
}
}
var whatever = map[string](func()) {
"hello": hello,
"list": list,
}
但是,它无法编译,因为函数和结构之间存在递归引用。尝试前向声明函数失败,并在定义时出现关于重新定义的错误,并且映射位于顶层。您如何定义这样的结构并在顶层初始化它们而无需使用init()
函数。
我在语言定义中看不到很好的解释。
- 存在的前向引用用于“外部”函数,当我尝试前向声明该函数时它不会编译。
- 我也找不到前向声明变量的方法。
更新:我正在寻找一种不需要您在启动程序或init()
函数时显式填充变量的解决方案。不确定这是否可能,但它适用于我所知道的所有可比较的语言。
更新 2: FigmentEngine提出了一种方法,我在下面给出了答案。它可以处理递归类型,还允许对所有命令的映射进行静态初始化。