登录
首页 >  Golang >  Go问答

接受映射并且仅针对键类型进行操作

来源:stackoverflow

时间:2024-03-10 10:39:25 234浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《接受映射并且仅针对键类型进行操作》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

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

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


解决方案


go 中唯一的多态性是接口。唯一的替代方案是反思、重复或重新思考更广泛的设计,这样您就不需要在这里做您想做的事情。

如果最后一个选项不可行,我个人会建议重复,因为它总共有四行代码。

keys := make([]string, 0, len(mymap))
for key,_ := range mymap {
    keys = append(keys,key)
}

一个大而复杂的通用助手似乎没有必要。

使用接口的解决方案。这个例子可能看起来有点矫枉过正,在你的情况下(我不确定,你的例子中没有足够的细节)最好只使用几个 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

今天关于《接受映射并且仅针对键类型进行操作》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>