快速掌握 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,今天的更新還沒完,次條還有切片知識補充哦