我有两个映射,它们都由strings
键控,但是值具有两种不同的自定义类型。
map[string]type1
map[string]type2
现在,我想编写一个可以接受这两种类型之一的参数的函数,因为该函数仅查看键,而根本不关心值。所以我认为它应该像这样:
func takeTheMap(argument map[string]interface{}) {
...
但是由于以下原因,该方法不起作用
cannot use myVariable (type map[string]customType) as type map[string]interface {} in argument to takeTheMap
https://play.golang.org/p/4Xkhi4HekO5
我能以某种方式使它起作用吗?
答案 0 :(得分:5)
Go中唯一的多态性是接口。唯一的选择是反射,重复或重新考虑更广泛的设计,因此您无需在这里做您想做的事情。
如果没有最后一个选择,我个人建议重复,因为它是一整行四行代码。
keys := make([]string, 0, len(myMap))
for key,_ := range myMap {
keys = append(keys,key)
}
一个大而复杂的通用助手似乎是不必要的。
答案 1 :(得分:0)
使用界面的解决方案。该示例似乎有些矫kill过正,对于您而言(我不确定您的示例中没有足够的细节),最好只使用几个for
循环。
package main
import (
"fmt"
)
type foo bool
type bar string
type mapOne map[string]foo
type mapTwo map[string]bar
func (m mapOne) Keys() []string {
s := []string{}
for k := range m {
s = append(s, k)
}
return s
}
func (m mapTwo) Keys() []string {
s := []string{}
for k := range m {
s = append(s, k)
}
return s
}
type ToKeys interface {
Keys() []string
}
func main() {
m1 := mapOne{"one": true, "two": false}
m2 := mapTwo{"three": "foo", "four": "bar"}
doSomething(m1)
doSomething(m2)
}
func doSomething(m ToKeys) {
fmt.Println(m.Keys())
}
游乐场example