我想将我所有的命令包含在一个映射中,并从该命令映射到执行此功能的函数(仅是标准调度表)。我从以下代码开始:
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提出了一种我在下面给出的答案。它可以处理递归类型,还可以静态初始化所有命令的映射。
根据上面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)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句