吾八哥学Golang(九):Golang里的map和sync.map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用,且不需要引入任何第三方库即可使用。
map的基础用法
map声明
map类型声明方式如下:
var 变量名 [key类型]value类型
例如:
var m map[string]int
map创建
map变量创建可以使用如下方法:
m := make(map[string]int) // 或指定存储长度 m := make(map[string]int, 10) // 或创建的时候初始化值 m := map[string]int{ "key1": 1, "key2": 2, }
注:当map长度到容量上限的时候,如果再增加新值,map的长度大小会自动加1,对于大的map或会快速扩张的map,会严重影响性能,所以建议即使只是大概知道容量,也最好先标明长度。
map赋值
赋值的方法比较简单,例如:
m["key1"] = 123
map删除元素
删除元素的方法如下:
delete(m, "key1")
若m为nil的时候,则这个方法会抛异常;若key1这个键不存在的话,则没有什么影响。
读取长度
读取map长度的方比较简单,直接使用len(m)即可。
读取元素
查找读取一个键值的方法为:
value, ok := m["key1"] if ok { fmt.Println(value) } else { fmt.Println("未找到key1") }
map默认是线程不安全的,需要加锁来保证,sync包提供了线程安全的map类型sync.map。
sync.map的用法
这里直接提供使用例子:
var syncMap sync.Map // 添加数据 syncMap.Store(1, "test-1") syncMap.Store(2, "test-2") syncMap.Store(3, "test-3") // 读取数据 v, ok := syncMap.Load(1) if !ok { fmt.Println("数据不存在") return } fmt.Println(v) // LoadOrStore方法用于不存在则添加,存在则返回 fmt.Println(syncMap.LoadOrStore(1, "www.5bug.wang")) // 删除数据 syncMap.Delete(1) // 循环遍历读取数据获取长度 len := 0 syncMap.Range(func(k, v interface{}) bool { len++ fmt.Println(k, v) return true }) fmt.Println("syncMap长度:", len)
这里仅仅从使用方法上介绍了map和sync.map,在一些高并发场景下的使用方式有比较多的细节需要考虑,建议大家多去阅读一些底层原理介绍方面的资料。