猿问

如何从同一地图内的另一个函数调用存储在地图中的函数

我正在尝试从同一张地图中定义的另一个函数调用地图中定义的函数。但是 Go 编译器说:“初始化循环”。这是代码:


package main


import ...


var calls = map[string]func(arg string) (interface[], error) {

    "function1": func(arg string) (interface{}, error) {

         // do stuff

         return res, nil

     },

    "function2": func(arg string) (interface{}, error) {

         res, error := calls["function1"](arg) // HERE IS THE ERROR

         return res, nil

     },

}

如何从地图内部调用其他函数?var 调用,不在函数内部



慕田峪7331174
浏览 119回答 2
2回答

波斯汪

在更正您的代码以便它甚至可以编译之后(即替换interface[]为interface{},并删除一些未定义的变量等),实际错误与初始化循环无关。确切的错误实际上是(参见操场示例):./prog.go:10:25:未定义:调用(如果您实际上收到有关初始化循环的错误而不是此错误,则可能意味着您粘贴的代码实际上与您的实际代码不够接近,因此请使用最小的、可重现的示例更新问题。)对此的解决方案是calls在定义引用它的函数之前进行定义。这很容易通过预定义calls为空地图(游乐场链接)来完成:    calls := make(map[string]func(string) (interface{}, error), 0 )    calls = map[string]func(arg string) (interface{}, error) {        "function1": func(arg string) (interface{}, error) {            // do stuff            return nil, nil        },        "function2": func(arg string) (interface{}, error) {            res, err := calls["function1"](arg) // HERE IS THE ERROR            return res, err        },    }

狐的传说

发生这种情况是因为在地图的初始化范围内,尚未分配“调用”地图。你可以有它如下:f1 := func(arg string) (interface{}, error) {    // do stuff    return nil, nil}var calls = map[string]func(arg string) (interface{}, error) {    "function1": f1,    "function2": func(arg string) (interface{}, error) {        res, error := f1(arg)        return res, nil    },}这样你就不需要在你的范围内有'calls'映射来获得'f1'值
随时随地看视频慕课网APP

相关分类

Go
我要回答