快速掌握 Go 语言中的集合(map)
我本来下午打算对新系统,好好研究下模块划分,但因为上一个版本提测,于是我改了一个下午的bug
。
现在是晚上 9 点钟我开始写这篇文章,给大家分析分析Go
语言中的map
。
映射关系容器 map
Go
语言提供的映射关系容器为 map
, map
使用散列表hash
实现。查找复杂度为O(1),和数组一样,最坏的情况下为O(n),n为元素总数。
这就是Go
中map
的定义格式。
map[keyType] valueType
注意了,map 是一种引用类型,初值是nil
,定义时必须用make
来创建,否则会报错
panic: assignment to entry in nil map
必须要申请空间,所有的引用类型都要这么做
var m map[string]string m = make(map[string]string)
当然,也可以这么写
m := make(map[string]string)
使用
赋值
m["name"] = "coding3min" m["sex"] = "man"
循环遍历
for key := range m { // 原来不用Printf也可以完成拼接输出啊! fmt.Println("key:", key, ",value:", m[key]) }
删除集合元素
delete(m, "name")
PS: 在取值的时候m[key],假如key不存在,不会报错,会返回value类型的默认值,比如int类型默认值为0
当然了,如果你想明确的知道元素是否存在,如下:
if value, ok := m[key]; ok { fmt.Println(key, "存在,值为:", value) } else { fmt.Println(key, " 不存在") }
map容器就到这里了。
能够在兵法环境中使用的map
Go中的map在并发读的时候没问题,但是并发写就不行了(线程不安全),会发生竞态问题。
所以有一个叫sync.Map的封装数据结构供大家使用,简单用法如下:
定义和存储
var scene sync.Map scene.Store("name", "coding3min") scene.Store("age", 11)
取值
v, ok := scene.Load("name") if ok { fmt.Println(v) } v, ok = scene.Load("age") if ok { fmt.Println(v) }
输出
coding3min 11
删除和遍历,这里遍历就用到了函数当作参数传递和匿名函数的知识。
scene.Delete("age") scene.Range(func(key, value interface{}) bool { fmt.Println("key:",key,",value:",value) return true })
the end,今天的更新还没完,次条还有切片知识补充哦