吾八哥学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,在一些高并发场景下的使用方式有比较多的细节需要考虑,建议大家多去阅读一些底层原理介绍方面的资料。