首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Go中使用递归引用

在Go中使用递归引用
EN

Stack Overflow用户
提问于 2013-10-28 10:54:31
回答 3查看 730关注 0票数 4

我希望将所有命令包含在一个映射中,并将其从命令映射到执行任务的函数(只是一个标准的调度表)。我从以下代码开始:

代码语言:javascript
复制
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建议了一种方法,我在下面给出了答案。它可以处理递归类型,并允许静态初始化所有命令的映射。

EN

Stack Overflow用户

回答已采纳

发布于 2013-10-30 10:17:14

根据上面FigmentEngine的建议,实际上可以创建一个静态初始化的命令数组。但是,您必须预先声明传递给函数的类型。下面我给出一个重写的例子,因为它可能对其他人有用.

让我们调用新类型的Context。它可以包含循环引用,如下所示。

代码语言:javascript
复制
type Context struct {
    commands map[string]func(Context)
}

一旦完成,就可以在顶层声明数组,如下所示:

代码语言:javascript
复制
var context = Context {
    commands: map[string]func(Context) {
        "hello": hello,
        "list": list,
    },
}

请注意,引用文件后面定义的函数是完全可以的,因此我们现在可以介绍这些函数:

代码语言:javascript
复制
func hello(ctx Context) {
    fmt.Print("Hello World!")
}

func list(ctx Context) {
    for key, _ := range ctx.commands {
        fmt.Print(key)
    }
}

完成后,我们可以创建一个主函数,它将调用声明上下文中的每个函数:

代码语言:javascript
复制
func main() {
    for key, fn := range context.commands {
        fmt.Printf("Calling %q\n", key)
        fn(context)
    }
}
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19632841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档