原文鏈接:http://oldchen.iwulai.com/index.php/2019/01/14/go%E5%9F%BA%E7%A1%80%E7%BC%96%E7%A8%8B%EF%BC%9A%E5%AD%97%E5%85%B8%EF%BC%88map%EF%BC%89/
Go 語言Map(字典,集合)
Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索數據,key 類似於索引,指向數據的值。
Map 是一種集合,所以我們可以像迭代數組和切片那樣迭代它。不過,Map 是無序的,我們無法決定它的返回順序,這是因爲 Map 是使用 hash 表來實現的。
1.定義 Map
可以使用內建函數 make 也可以使用 map 關鍵字來定義 Map:
/* 聲明變量,默認 map 是 nil */ var map_variable map[key_data_type]value_data_type /* 使用 make 函數 */ map_variable := make(map[key_data_type]value_data_type)
如果不初始化 map,那麼就會創建一個 nil map。nil map 不能用來存放鍵值對
var m1 map[int]string //只是聲明一個map,沒有初始化, 此爲空(nil)map
fmt.Println(m1 == nil) //true
//m1[1] = "mike" //err, panic: assignment to entry in nil map
2. 創建和初始化
2.1 map的創建
package main
import "fmt"
func main(){
var m1 map[int]string //只是聲明一個map,沒有初始化, 此爲空(nil)map
fmt.Println(m1 == nil)//true
//m1[1] = "mike" //err, panic: assignment to entry in nil map
//m2, m3的創建方法是等價的
m2 := map[int]string{}
m3 := make(map[int]string)
fmt.Println(m2, m3)//map[] map[]
m4 := make(map[int]string, 10)//第2個參數指定容量
fmt.Println(m4)//map[]
}
2.2 初始化
package main
import "fmt"
func main(){
//1、定義同時初始化
var m1 map[int]string = map[int]string{1: "mike", 2: "yoyo"}
fmt.Println(m1) //map[1:mike 2:yoyo]
//2、自動推導類型 :=
m2 := map[int]string{1: "mike", 2: "yoyo"}
fmt.Println(m2)//map[1:mike 2:yoyo]
}
3. 常用操作
3.1 賦值
package main
import "fmt"
func main(){
a1 :=map[int] string{1:"a",2:"aa"}
a1[1] ="XX"//修改
a1[3] ="zhuijia"//追加, go底層會自動爲map分配空間
fmt.Println(a1)//map[1:XX 2:aa 3:zhuijia]
a2 :=make(map[int]string, 10)//創建map
a2[0] = "00"
a2[1] = "11"
fmt.Println(a2)//map[0:00 1:11]
fmt.Println(a2[0], a2[1])//00 11
}
3.2 遍歷
package main
import "fmt"
func main(){
a1 :=map[int] string{1:"a",2:"aa"}
//迭代遍歷1,第一個返回值是key,第二個返回值是value
for k,v := range a1{
fmt.Printf("%d-->%s\n",k,v)// 1-->a 2-->aa
}
//迭代遍歷2,第一個返回值是key,第二個返回值是value(可省略)
for k :=range a1{
fmt.Printf("%d-->%s\n",k,a1[k])// 1-->a 2-->aa
}
//判斷某個key所對應的value是否存在, 第一個返回值是value(如果存在的話)
value, ok :=a1[1]
fmt.Println("value = ", value, ", ok = ", ok)//value = a , ok = true
value2, ok2 :=a1[3]
fmt.Println("value2 = ", value2, ", ok2 = ", ok2)//value2 = , ok2 = false
}
3.3 刪除
package main
import "fmt"
func main(){
m1 := map[int]string{1: "mike", 2: "yoyo", 3: "lily"}
//迭代遍歷1,第一個返回值是key,第二個返回值是value
for k, v := range m1 {
fmt.Printf("%d ----> %s\n", k, v)
//1 ----> mike 2 ----> yoyo 3 ----> lily
}
delete(m1, 2) //刪除key值爲2的map
for k, v := range m1 {
fmt.Printf("%d ----> %s\n", k, v)
//1 ----> mike 3 ----> lily
}
}
4. map做函數參數
在函數間傳遞映射並不會製造出該映射的一個副本,不是值傳遞,而是引用傳遞:
package main
import "fmt"
func DeleteMap(m map[int]string, key int){ //刪除函數
delete(m, key)
for k, v := range m {
fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
//len(m)=2, 1 ----> mike
//len(m)=2, 3 ----> lily
}
}
func main(){
m := map[int]string{1: "mike", 2: "yoyo", 3: "lily"}
DeleteMap(m, 2) //調用函數 刪除key值爲2的map
for k, v := range m {
fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
//len(m)=2, 1 ----> mike
//len(m)=2, 3 ----> lily
}
}
等價於:delete函數
package main
import "fmt"
func main(){
m :=map[int]string {1:"mike", 2:"yoyo", 3:"lily"}
delete(m, 1)//調用函數 刪除key值爲2的map
for k, v:= range m{
fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
// len(m)=2, 2 ----> yoyo
// len(m)=2, 3 ----> lily
}
}