Map 是一種無序的鍵值對的集合忌怎。Map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引柔袁,指向數(shù)據(jù)的值呆躲。
Map 是一種集合,所以我們可以像迭代數(shù)組和切片那樣迭代它捶索。不過插掂,Map 是無序的,我們無法決定它的返回順序腥例,這是因為 Map 是使用 hash 表來實現(xiàn)的辅甥。
Map的聲明
聲明的map是nil
var map_name map[string]string
var dic map[string]string
//默認map是nil ,它與一個空map基本等價燎竖,只是nil的map不允許往里面添加值璃弄。(A nil map is equivalent to an empty map except that no elements may be added)
因此,map是nil時构回,取值是不會報錯的(取不到而已)夏块,但增加值會報錯。
通過fmt打印map時纤掸,空map和nil map結果是一樣的脐供,都為map[]。所以借跪,這個時候別斷定map是空還是nil政己,而應該通過map == nil來判斷。
聲明的map是null
var map_name = map[type]type{}
var dic = map[string]string{} // NULL
var dic1 = map[int]string{}//or: dic1 := map[int]string{}
package main
import "fmt"
func main() {
// 初始化一個map掏愁,map我們也經(jīng)常叫做字典
var dic = map[string]string{} // NULL
// ""
fmt.Println(dic)
fmt.Printf("%T\n", dic)
fmt.Println(len(dic))
dic["name"] = "zhang"
fmt.Println(dic)
fmt.Println(len(dic))
fmt.Println(dic == nil)
}
輸出為:
map[]
map[string]string
0
map[name:zhang]
1
false
如果這么聲明 dic1 := map[int]string{}
請注意“}”與“歇由,”的寫法
dic := map[string]string{
"name": "zelin",
"age": "18", //如果 “}”和30這個字符串挨在一起,最后這個”,“可以不需要果港,否則必須添加
}
map 最好使用 make 函數(shù)初始化
通過向 make 函數(shù)傳入鍵和值的類型沦泌,可以創(chuàng)建 map。
make(map[type of key]type of value) 是創(chuàng)建 map 的語法辛掠。
myGreeting := make(map[string]string) //NULL
等價于下面三種寫法
// var myGreeting = make(map[string]string)
// myGreeting := map[string]string{}
// var myGreeting = map[string]string{}
myGreeting["Tim"] = "Good morning"
myGreeting["Jenny"] = "Bonjour"
fmt.Println(myGreeting)
// 返回字典鍵值對的個數(shù)
fmt.Println(len(myGreeting))
輸出為:
map[Tim:Good morning Jenny:Bonjour]
2
map的使用
map的增赦肃,刪,改公浪,查
package main
import "fmt"
func main() {
dic := map[int]string{
1: "張三",
2: "李四",
3: "王五",
4: "找六",
}
fmt.Println(dic)
// 更新num one
dic[1] = "ze lin"
fmt.Println(dic)
// 添加
dic[5] = "澤林"
fmt.Println(dic)
// 刪除
// func delete(m map[Type]Type1, key Type)
// 如果函數(shù)有返回值,會將原來的數(shù)據(jù)重新拷貝一份新的空間船侧,如果沒有返回值欠气,那么是在原來的空間里面直接修改數(shù)據(jù)
// delete(map[typeA]typeB, typeA)
delete(dic, 3)
fmt.Println(dic)
// 查詢
fmt.Println(dic[1])
}
輸出為:
map[1:張三 2:李四 3:王五 4:找六]
map[1:ze lin 2:李四 3:王五 4:找六]
map[3:王五 4:找六 5:澤林 1:ze lin 2:李四]
map[5:澤林 1:ze lin 2:李四 4:找六]
ze lin
判斷key是否存在的問題
package main
import "fmt"
func main() {
dic := map[string]string{
"name": "zelin",
"tel": "185........",
}
// age
if name, isExist := dic["name"]; isExist {
fmt.Println(name)
fmt.Println(isExist)
}
if val, ok := dic["age"]; !ok {
fmt.Println(val)
fmt.Println(ok)
}
}
輸出為:
zelin
true
false
遍歷 map
遍歷 map 中所有的元素需要用 for range 循環(huán)。
package main
import "fmt"
func main() {
myGreeting := map[int]string{
0: "Good morning!",
1: "Bonjour!",
2: "Buenos dias!",
3: "Bongiorno!",
}
// for index := 0; index < len(myGreeting); index++ {
// }
for key, val := range myGreeting {
fmt.Println(key, " - ", val)
}
}
輸出為:
0 - Good morning!
1 - Bonjour!
2 - Buenos dias!
3 - Bongiorno!