带地图且仅在乎键类型的函数

时间:2019-01-31 14:38:49

标签: go

我有两个映射,它们都由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

我能以某种方式使它起作用吗?

2 个答案:

答案 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