golang學習筆記-map類型

在剛剛接觸go語言的時候,就看到不少地方出現了map。就對這個map很困惑,那麼這個map到底是什麼呢。讓咱們一塊兒來看一看吧。數組

map (映射)是一個種數據結構,用於存儲一些無序的鍵值對。映射使用了兩個數據結構來存儲數據。第一個數據結構是數組,內部存儲的是用戶選擇桶的散列值。第二個數據結構是一個字節數組,用於存儲鍵值對。映射是一個存儲鍵值對的無序集合。

建立和初始化

go語言中可使用make函數,也可使用使用字面量的方法來建立映射(map)。以下所示數據結構

//經過make函數 建立一個映射,鍵類型是string ,值是int
   list := make(map[string]int)
   list["test"]= 1
   fmt.Println(list["test"])
   
   //建立一個映射,鍵值都是string  使用字面量
   data := map[string]string{"top":"is top","bottom":"is bottom"}
   fmt.Println(data["top"])

建立映射更經常使用的方法應該是使用字面量,映射的初始長度會根據初始化時指定的鍵值對數量來肯定,映射的鍵能夠是任何值,這個值能夠是內置類型,也能夠是結構類型,只要這個值能夠用==運算符比較。須要注意是:切片,函數以及包含切片的結構不能作爲映射的鍵。函數

映射的使用

賦值
//經過make函數 建立一個映射,鍵類型是string ,值是int
   list := make(map[string]int)
 //將test的值加入映射
   list["test"]= 1

能夠經過什麼一個未初始化的映射來建立一個nil映射,nil映射不能用於儲存鍵值對spa

var numbers map[int]int
   numbers[1]=1 //這裏會產生一個錯誤
判斷鍵是否存在於映射以及取值

判斷某個鍵是否存在於映射中是一個常常使用的操做。從映射中取值時有兩個方式。第一個是,同時獲取值,以及一個表示鍵是否存在的標誌code

data := map[string]string{"top":"is top","bottom":"is bottom"}
   val,exists := data["top"]
   //若是這個鍵存在
   if exists {
      fmt.Println(val)
   }  else {
      fmt.Println("top 不存在")
   }

第二個方式是,只獲取鍵對應的值,經過這個值是不是零值來判斷是否存在。可是若是這個鍵對應的恰好是零值,那麼這個判斷就會不許確string

data := map[string]string{"top":"is top","bottom":""}
   v := data["bottom"]
   if v!="" {
      fmt.Println(v)
   }else {
      fmt.Println("bottom 不存在")
   }
   v2 := data["left"]
   if v2!="" {
      fmt.Println(v2)
   }else {
      fmt.Println("left 不存在")
   }

以上代碼會獲得it

bottom 不存在
left 不存在

但實際上映射中是存在鍵bottomclass

映射的迭代和數組、切片的迭代同樣,使用range關鍵字
data := map[string]string{"top":"is top","bottom":"is bottom","left":"is left","right":"is right"}
   for k,v := range data{
      fmt.Printf("k:%s  v:%s\n",k,v)
   }

須要注意的是,由於映射是一個無序集合。因此每次迭代獲得的鍵值對順序是不同的。test

刪除映射中的某一個項,使用內置函數 delete
data := map[string]string{"top":"is top","bottom":"is bottom","left":"is left","right":"is right"}
  delete(data,"top")
映射的傳遞(引用類型)

在函數間傳遞映射並不會製造出該映射的一個副本。實際上,當傳遞映射給一個函數,並對
這個映射作了修改時,全部對這個映射的引用都會察覺到這個修改。map

func main() {
     m := map[int]int{
         0:0,
         1:1,
         2:2,
         3:3,
     }

    fmt.Println(m)
    changeMap(m)
    fmt.Println(m)
     delMap(m)
    fmt.Println(m)


}
func changeMap(m map[int]int)  {
        m[1]=111
}

func delMap(m map[int]int)  {
    delete(m,1)
}

上面示例將會輸出

map[0:0 1:1 2:2 3:3]
map[0:0 1:111 2:2 3:3]
map[0:0 2:2 3:3]

能夠看到在changeMap中改變了map的值或者delMap中刪除了某一直鍵值對,main中的值也改變了。這個特性和切片相似,保證能夠用很小的成原本複製映射。

1220188706-5d48273c534a2_articlex

相關文章
相關標籤/搜索