如何声明一个接受 golang 中任何类型值的映射参数?

Xia*_*Cui 3 generics go

为了您的方便:去游乐场

我有一个函数不关心映射参数的值类型,所以我将其声明为:

func foo(generalMap map[string]interface{}) {}

但是当我用指定的地图调用它时,如下所示:

myMap := make(map[string]Bar)
foo(myMap)
Run Code Online (Sandbox Code Playgroud)

然后编译器就报错了: cannot use myMap (type map[string]Bar) as type map[string]interface {} in argument to foo

for*_*ack 7

你不能这样做。map[string]interface{}map[string]Bar是两种不同的类型。您必须手动构建map[string]interface{}一个map[string]Bar

mapAny := make(map[string]interface{})
for key, val := range myMap {
    mapAny[key] = val
}
foo(mapAny)
Run Code Online (Sandbox Code Playgroud)

你需要的是C++中的模板,但是Golang没有模板支持。

  • 来自未来的你好,现在是 2022 年 3 月,我们现在有 go-1.18。对于阅读本文的任何人,您现在可以使用类型别名,如下所示:“map[string]any”。其中“any”是“interface{}”的类型别名。祝你有美好的一天! (5认同)