本系列前面的文章:
1. 宣告
map是一種對映,可以將鍵(key
)對映到值(value
),格式為:map[keyType]valueType
。
宣告一個map並初始化它,使用key:value
進行初始化:
var scores = map[string]int {"數學":100, "語文":90, "Go":100}
如果不想直接初始化,可以先宣告再使用,注意這樣需要使用make
函式初始化後才能使用:
var scores map[string]int
scores = make(map[string]int)
為什麼這樣宣告需要使用make
函式?
map
的零值是nil map
,沒有鍵,也不能新增鍵。
var m map[string]int //宣告一個m map,它現在預設是nil
fmt.Println(m) //map[]
m["A"] = 1 //報錯:assignment to entry in nil map
所以為了不讓該map
不是nil
,需要使用make
初始化:
var m map[string]int //nil
m = make(map[string]int) //初始化
m["A"] = 1 //新增元素
fmt.Println(m) //map[A:1]
當然,方便的短變數宣告方式也能用:
m := map[string]int {"A":1, "B":2}
或者
m := make(map[string]int)
m["A"] = 1
m["B"] = 2
2. 增刪改查
(增)增加鍵值對:
scores["數學"] = 100 //向scores這個map新增了鍵為“數學”,值為100的資料
scores["語文"] = 90
(刪)刪除鍵值對:
delete(scores, "語文")
(改)修改鍵值對和增加鍵值對的語法相同(當key
不存在時為增加,當key
存在時為修改):
scores["語文"] = 10
(查)使用key
可以查詢到對應的value
,會返回兩個值,第一個是key
對應的value
,第二個是布林值(如果key
存在,是true
;否則是false
)。如果查詢的key
不存在,則會返回value
型別的“零值”:
score, exist := scores["數學"] //使用兩個返回值
fmt.Println(score, exist) //100 true
score1 := scores["語文"] //使用一個返回值
fmt.Println(score1) //90
score2, exist2 := scores["Java"] //查詢不存在的key
fmt.Println(score2, exist2) //0 false
3. 其他用法
和slice
一樣,map
也是引用型別,則意味著,如果有幾個map
同時指向一個底層map
,其中一個map
改變某個鍵值對,那麼其他的也會做出同樣的改變(因為底層map
變了)。
package main
import "fmt"
func main() {
map0 := make(map[string]string) //底層map0
map0["name"] = "XingXiaoguan" //增加一個鍵值對
//map1 map2 引用map0
map1 := map0
map2 := map0
fmt.Println(map0["name"], map1["name"], map2["name"]) //都是XingXiaoguan
map1["name"] = "XingRenGuanXue" //改變map1的name對應的值
fmt.Println(map0["name"], map1["name"], map2["name"]) //全部變為XingRenGuanXue
}
使用len
函式可以獲取map
中key
的數量:
keyNum := len(scores) //獲取scores這個map中key的數量
map
是無序的,所以其返回的元素順序可能每次都不同。
可以使用range
關鍵字遍歷map
,這裡range
返回的第一個值是key
,第二個值是value
:
//遍歷scores map
for key, value := range scores {
fmt.Println(key, value)
}
輸出:
數學 100
語文 90
如有錯誤,還請指正。
4. 關於我
點選這裡認識我 。 (^o^)/