猿问

采用 map 且只关心键类型的函数

我有两个地图,它们都由 键控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

我能以某种方式让它工作吗?


炎炎设计
浏览 106回答 2
2回答

繁星coding

Go 中唯一的多态性是接口。唯一的替代方法是反思、复制或重新考虑更广泛的设计,这样您就不需要做您在这里想做的事情。如果最后一个选项不可能,我个人建议复制,因为它是整整四行代码。keys := make([]string, 0, len(myMap))for key,_ := range myMap {    keys = append(keys,key)}一个大而复杂的通用助手似乎是不必要的。

慕娘9325324

使用接口的解决方案。这个例子可能看起来有点矫枉过正,在你的情况下(我不确定,你的例子中没有足够的细节)最好只使用几个循环for。package mainimport (    "fmt")type foo booltype bar stringtype mapOne map[string]footype mapTwo map[string]barfunc (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())}游乐场示例
随时随地看视频慕课网APP

相关分类

Go
我要回答