[Go语言]实现可以枚举的map
时间:2022-05-05
本文章向大家介绍[Go语言]实现可以枚举的map,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在golang-nuts上看到有人问怎么样去枚举一个map。在go语言层面,并不支持支持枚举map,也就是说你不能获得一个枚举器在任意时刻去枚举这个map,只能用range一次性地遍历这个map。但是我们可以用map+list的方式来实现一个可以枚举的map。请看代码:
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语言不直接提供枚举器或者枚举的方法呢?
- Mac系统的Proton恶意软件:卷!土!重!来!
- Erlang语言学习入门
- Android使用Ant进行apk多渠道打包
- Dance In Heap(三):一些堆利用的方法(中)
- Android性能优化篇:使用软引用和弱引用
- 使用泛型委托,构筑最快的通用属性访问器
- 记录容易忘记的方法
- 无需重新编译代码,在线修改表单
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- 结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
- 使用表达式树,让访问者直接执行“角色”对象的方法
- 【更正】“给自定义控件(Web Control)添加事件的几种方法”有一个不太准确的地方。
- 在数据库上实现类似铁路售票锁票功能
- Android代码判断手机是否已root方法学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TextView中URL等指定特殊字符串与点击事件解析
- Android开发实现仿京东商品搜索选项卡弹窗功能
- Android开发中button按钮的使用及动态添加组件方法示例
- Kotlin开发的一些实用小技巧总结
- Android使用URLConnection提交请求的实现
- android原生JSON解析实例
- iOS新闻类App内容页技术探索
- Android仿iphone自定义滚动选择器
- Android仿iPhone日期时间选择器详解
- Android 仿余额宝数字跳动动画效果完整代码
- Android中判断listview是否滑动到顶部和底部的实现方法
- Android开发实现的简单媒体播放器功能示例
- Android中的颜色表示的详解
- android使用SoundPool播放音效的方法
- android中Context深入详解