前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Go语言]实现可以枚举的map

[Go语言]实现可以枚举的map

作者头像
李海彬
发布2018-03-26 13:18:07
1.6K0
发布2018-03-26 13:18:07
举报
文章被收录于专栏:Golang语言社区Golang语言社区

在golang-nuts上看到有人问怎么样去枚举一个map。在go语言层面,并不支持支持枚举map,也就是说你不能获得一个枚举器在任意时刻去枚举这个map,只能用range一次性地遍历这个map。但是我们可以用map+list的方式来实现一个可以枚举的map。请看代码:

代码语言:javascript
复制
import (

"container/list"
"fmt"
)
type Iterator struct {

e *list.Element
}
func (p *Iterator) Valid() bool {

return p.e != nil
}
func (p *Iterator) Value() (int, int) {

pe := p.e.Value.(*Element)

return pe.k, pe.v
}
func (p *Iterator) Next() {

p.e = p.e.Next()
}
type Element struct {

k, v int
}
type ListMap struct {

m map[int]*list.Element
l *list.List
}
func NewListMap() *ListMap {

return &ListMap{


m: make(map[int]*list.Element),

l: list.New(),

}
}
func (p *ListMap) Set(k, v int) {

e, ok := p.m[k]
if ok {


e.Value.(*Element).v = v

} else {


p.m[k] = p.l.PushBack(&Element{k, v})

}
}
func (p *ListMap) Remove(k int) {

e, ok := p.m[k]
if ok {


delete(p.m, k)

p.l.Remove(e)

}
}
func (p *ListMap) Get(k int) (int, bool) {

e, ok := p.m[k]
if !ok {


return 0, false

}
return e.Value.(*Element).v, true
}
func (p *ListMap) Iterate() Iterator {

return Iterator{p.l.Front()}
}

使用的例子:

func main() {


m := NewListMap()

m.Set(1, 1)

m.Set(2, 2)

m.Set(3, 3)

m.Set(3, 300)

m.Remove(2)

it := m.Iterate()

for it.Valid() {



fmt.Println(it.Value())


it.Next()


}

}

输出:

1 1

3 300

说明:

为了达到更好的通用性,可以把key和value的类型都换成interface{}类型,但是会稍微损失一些性能。

一个思考题:

为什么go语言不直接提供枚举器或者枚举的方法呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档