在 Go 中,map 是可以存储键值对的通用数据结构。有时,将函数存储在映射中很有用,允许基于键进行动态调用。
问题:
假设您有多个函数并想要创建一个映射,其中键是函数名称,值是函数本身。但是,当尝试执行此操作时,如下所示,您会遇到错误:
func a(param string) {} m := map[string]func{} 'a_func': a, } for key, value := range m { if key == 'a_func' { value(param) } }
解决方案:
出现此问题的原因是定义特定于类型的映射的语法是不正确的。要解决此问题,您可以使用语法 map[string]interface{} 代替,因为值不强制类型安全。下面的修改示例说明了如何存储和调用映射中的函数:
package main import "fmt" func f(p string) { fmt.Println("function f parameter:", p) } func g(p string, q int) { fmt.Println("function g parameters:", p, q) } func main() { m := map[string]interface{}{ "f": f, "g": g, } for k, v := range m { switch k { case "f": v.(func(string))("astring") case "g": v.(func(string, int))("astring", 42) } } }
在此示例中,映射 m 将两个函数值存储为 interface{}。当根据 key 调用函数时,会执行类型断言,将接口值转换为正确的函数类型。
以上是Go中如何使用Map动态存储和调用函数?的详细内容。更多信息请关注PHP中文网其他相关文章!