吾八哥博客

您现在的位置是:首页 > 码农手记 > Golang > 正文

Golang

吾八哥学Golang(九):Golang里的map和sync.map

吾八哥2018-01-30Golang1377

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