Go語言入門5-map
阿新 • • 發佈:2019-01-06
- 類似其它語言中的雜湊表或者字典,以key-value形式儲存資料
- Key必須是支援==或!=比較運算的型別,不可以是函式、map或slice
- Map查詢比線性搜尋快很多,但比使用索引訪問資料的型別慢100倍
- Map使用make()建立,支援 := 這種簡寫方式
func main() {
m := make(map[int]string) //int是健的型別 string是值的型別
m[1] = "ok"
fmt.Println(m) //map[1:ok]
a := m[1]
fmt.Println(a)
delete(m, 1) //ok
fmt. Println(m) //map[]
}
當有多個map巢狀map的時候,每一級的map都要單獨的初始化,否則執行時會報錯。
//返回值為兩個時 第二個引數為bool 型別 可以判斷第二個引數來判斷第一個引數是否正確
func main() {
m := make(map[int]map[int]string)
a, ok := m[2][1]
fmt.Println(a, ok) // false
if !ok {
m[2] = make(map[int]string)
}
m[2][1] = "good"
a, ok = m[2][1]
fmt.Println(a, ok) good true
}
遍歷(v只是一個拷貝,對v的任何操作都不會影響本身的slice)
func main() {
sm := make([]map[int]string, 5)
for _, v := range sm {
v = make(map[int]string, 1)
v[1] = "ok"
fmt.Println(v)
}
fmt.Println(sm)
}
結果:
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[] map[] map[] map[] map[]]
如果想改變本身的slice,則需要用i,例:
func main() {
sm := make([]map[int]string, 5)
for i := range sm {
sm[i] = make(map[int]string, 1)
sm[i][1] = "ok"
fmt.Println(sm[i])
}
fmt.Println(sm)
}
結果
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[1:ok] map[1:ok] map[1:ok] map[1:ok] map[1:ok]]
迴圈map是無序的,不能夠直接排序。
func main() {
m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "f"}
s := make([]int, len(m))
i := 0
for k, _ := range m {
s[i] = k
i++
}
fmt.Println(s)
}
每次執行後的結果都不相同,這也就證明了map是無序的
➜ gogogo go run demo.go
[5 1 2 3 4]
➜ gogogo go run demo.go
[1 2 3 4 5]
➜ gogogo go run demo.go
[3 4 5 1 2]
➜ gogogo
下面我們通過匯入sort包間接的讓map有序
func main() {
m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "f"}
s := make([]int, len(m))
i := 0
for k, _ := range m {
s[i] = k
i++
}
sort.Ints(s)
fmt.Println(s) //[1 2 3 4 5]
}
每次執行後的結果相同了,這就間接實現了map的有序
➜ gogogo go run demo.go
[1 2 3 4 5]
➜ gogogo go run demo.go
[1 2 3 4 5]
➜ gogogo go run demo.go
[1 2 3 4 5]
➜ gogogo
demo:嘗試將型別為map[int]string的鍵和值進行交換,變成型別map[string]int
func main() {
m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "f"}
fmt.Println(m1)
m2 := make(map[string]int)
for k, v := range m1 {
m2[v] = k
}
fmt.Println(m2)
}
結果
map[1:a 2:b 3:c 4:d 5:f]
map[b:2 c:3 d:4 f:5 a:1]