在Go中使用递归引用

马茨·金达尔

我想将我所有的命令包含在一个映射中,并从该命令映射到执行此功能的函数(仅是标准调度表)。我从以下代码开始:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++的递归函数中使用引用参数

来自分类Dev

在C ++的递归函数中使用引用参数

来自分类Dev

在递归中使用引用会导致内存泄漏?

来自分类Dev

在递归数据结构中使用常规引用而不是`Box`

来自分类Dev

在PostgreSQL的递归WITH中使用WITH

来自分类Dev

在C中使用递归

来自分类Dev

在C ++中使用引用

来自分类Dev

在递归中使用变量

来自分类Dev

在 Java 中使用递归的 BinarySearch

来自分类Dev

在Go中使用递归函数时,如果内部函数返回,外部函数是否可以继续正常执行?

来自分类Dev

在类引用中使用ClassSymbol

来自分类Dev

在C ++中使用双引用

来自分类Dev

在Swift中使用对CFPropertyListRef的引用

来自分类Dev

在ajax中使用$(this)引用元素

来自分类常见问题

在Python中使用多个递归函数

来自分类Dev

在D中使用指针实现递归函数

来自分类Dev

Matlab中使用regexp的递归技巧

来自分类Dev

在python中使用lambda进行无限递归

来自分类Dev

避免在递归调用中使用null ref

来自分类Dev

在Python中使用派生递归定义函数

来自分类Dev

在Java中使用递归反转句子

来自分类Dev

在Haskell中使用尾递归拆分BinTree

来自分类Dev

在C中使用递归的堆栈溢出

来自分类Dev

如何在Hive中使用递归查询

来自分类Dev

在递归中使用--a和a-1

来自分类Dev

在Python中使用递归的素数总和

来自分类Dev

在C中使用递归的反向编号功能

来自分类Dev

在递归循环中使用父数据

来自分类Dev

如何在std :: list中使用递归?