快速掌握 Go 語言中的集合(map)

快速掌握 Go 語言中的集合(map)

我本來下午打算對新系統,好好研究下模塊劃分,但因爲上一個版本提測,於是我改了一個下午的bug

現在是晚上 9 點鐘我開始寫這篇文章,給大家分析分析Go語言中的map

映射關係容器 map

Go語言提供的映射關係容器爲 mapmap 使用散列表hash實現。查找複雜度爲O(1),和數組一樣,最壞的情況下爲O(n),n爲元素總數。

這就是Gomap的定義格式。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章