Go基礎編程:字典(map)

原文鏈接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
    }
}

 

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