为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中迭代 Struct(映射键)值

在 golang 中迭代 Struct(映射键)值

Go
呼如林 2021-09-13 16:32:12
我在 Golang 地图中查找结构作为键我知道在 golang 中对地图的迭代没有保证的顺序。我遵循了golang blog 中的示例,并尝试使用 astruct作为映射键。这是我的代码package mainfunc main() {    req := make(map[mapKey]string)    req[mapKey{1, "r"}] = "robpike"    req[mapKey{2, "gri"}] = "robert griesemer"    req[mapKey{3, "adg"}] = "andrew gerrand"    req[mapKey{4, "rsc"}] = "russ cox"    var keys []int    for k := range req {        keys = append(keys, k.Key)    }    for _, k := range keys {        fmt.Printf("short name : %s , long name : %s\n",req[k], req[k]) // How do I iterate here    }    sort.Ints(keys)}type mapKey struct {    Key    int    Option string}我想要的结果是short name : r , long name : rob pikeshort name : gri , long name : robert griesemershort name : adg , long name : andrew gerrandshort name : rsc , long name : russ cox而且我不知道如何获得由分离的数据结构迭代的结构值和键。
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

精简版?你不能那样做。


长版你,你可以使用自定义排序器:


func main() {

    req := make(map[mapKey]string)


    req[mapKey{1, "r"}] = "robpike"

    req[mapKey{2, "gri"}] = "robert griesemer"

    req[mapKey{3, "adg"}] = "andrew gerrand"

    req[mapKey{4, "rsc"}] = "russ cox"


    var keys mapKeys

    for k := range req {

        keys = append(keys, k)

    }

    sort.Sort(keys)

    for _, k := range keys {

        fmt.Printf("short name : %s , long name : %s\n", k.Option, req[k])

    }

}


type mapKey struct {

    Key    int

    Option string

}


type mapKeys []mapKey


func (mk mapKeys) Len() int           { return len(mk) }

func (mk mapKeys) Swap(i, j int)      { mk[i], mk[j] = mk[j], mk[i] }

func (mk mapKeys) Less(i, j int) bool { return mk[i].Key < mk[j].Key }

play


请记住,如果您的mapKey结构有一个不支持相等的字段(又名结构或切片),则 usingreq[k]将不起作用。


在这种情况下,您可以切换到type mapKeys []*mapKey和map[*mapKey]string。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信