我希望将所有命令包含在一个映射中,并将其从命令映射到执行任务的函数(只是一个标准的调度表)。我从以下代码开始:
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建议了一种方法,我在下面给出了答案。它可以处理递归类型,并允许静态初始化所有命令的映射。
发布于 2013-10-30 10:17:14
根据上面FigmentEngine的建议,实际上可以创建一个静态初始化的命令数组。但是,您必须预先声明传递给函数的类型。下面我给出一个重写的例子,因为它可能对其他人有用.
让我们调用新类型的Context。它可以包含循环引用,如下所示。
type Context struct {
commands map[string]func(Context)
}一旦完成,就可以在顶层声明数组,如下所示:
var context = Context {
commands: map[string]func(Context) {
"hello": hello,
"list": list,
},
}请注意,引用文件后面定义的函数是完全可以的,因此我们现在可以介绍这些函数:
func hello(ctx Context) {
fmt.Print("Hello World!")
}
func list(ctx Context) {
for key, _ := range ctx.commands {
fmt.Print(key)
}
}完成后,我们可以创建一个主函数,它将调用声明上下文中的每个函数:
func main() {
for key, fn := range context.commands {
fmt.Printf("Calling %q\n", key)
fn(context)
}
}https://stackoverflow.com/questions/19632841
复制相似问题