一篇文章帶你瞭解 Go 語言基礎之 map

前言

Hey,大家好呀,我是星期八,這次咱們繼續學習 Go 基礎之 map 扒。

回憶往事

在上述的多個文章中,我們學習了數據類型數組切片等幫助我們存儲數據。

尤其是是切片,可以存儲多個東西,並且可以靈活的增刪改查。

但是切片仍然有不太方便的地方。

比如學生,一個學生的信息是多個的,例如姓名身高體重年齡等。

如果使用切片,我們可能是這樣存儲的。

package main
import "fmt"
func main() {
    //學生1
    var stu1 = []string{"張三" "188" "70KG" "18"}
    //學生2
    var stu2 = []string{"李四" "170" "66KG" "17"}
    fmt.Println(stu1)
    fmt.Println(stu2)
}

如果按照目前所接受的知識,只能到這了,我也只能想到這。

但是會有一個明顯的缺點,就是我們需要通過下標取值或者修改值

並且我們還得數一下想修改的值的下標在哪個位置,相對來說,不是那麼方便。

引入 map

map,在 Python 中叫字典,Java 中也叫 map,PHP 中好像列表就帶有 map 的功能。

map 是鍵值對 (key-value) 存儲結構,是無序的,內部使用哈希 (hash) 實現,性能很高。

在 Go 中,map 是引用類型,內存圖如下。

map 基本使用


map 語法

方式一,聲明時賦值
var 變量名 = map[key類型][value類型]{
    key:value,
    key:value,//必須使用,結尾,否則會報錯
}
//方式二,make方式
var 變量名 = make(map[key類型]value類型, 容量(cap))
//如果map是make方式聲明的,第二個參數直接就是容量,元素個數是0,沒有第三個參數

示例

方式一,聲明時賦值

代碼

package main
import "fmt"
func main() {
    var stu1 = map[string]string{
        "Name":   "張三"
        "Age":    "18"
        "height": "188" //每行都要以,結尾,
}
    var stu2 = map[string]string{
        "Name":   "李四"
        "Age":    "20"
        "height": "170" //每行都要以,結尾,
}
    fmt.Println(stu1 stu2) 
    //map[Age:18 Name:張三 height:188] map[Age:20 Name:李四 height:170]
}

方式二,make 方式

代碼

package main
import "fmt"
func main() {
    var stu1 = make(map[string]string10)
    stu1["Name"] = "張三"
    stu1["Age"] = "18"
    stu1["height"] = "188"
    var stu2 = make(map[string]string10)
    stu2["Name"] = "李四"
    stu2["Age"] = "20"
    stu2["height"] = "170"
    fmt.Println(stu1stu2)
    //map[Age:18 Name:張三 height:188] map[Age:20 Name:李四 height:170]
}

ps: 關於這兩種方式,哪個使用的多。

我的建議是,如果確定有多少個字段,就使用第一種,如果不確定多少個字段,是動態添加的,用第二種。

使用第二種要大概估算好容量,超過會觸發自動擴容機制,可能會產生那麼一絲絲的性能影響。

遍歷 map(查)

遍歷 map,通常只用一種方式for range

代碼

package main
import "fmt"
func main() {
    var stu1 = make(map[string]string 10)
    stu1["Name"] = "張三"
    stu1["Age"] = "18"
    stu1["height"] = "188"
    for key value := range stu1 {
        //map遍歷時,key值鍵,value是值
        fmt.Println(key value)
  }
}

只遍歷 key

package main
import "fmt"
func main() {
    var stu1 = make(map[string]string 10)
    stu1["Name"] = "張三"
    stu1["Age"] = "18"
    stu1["height"] = "188"
    for key := range stu1 {
        //只遍歷key
        fmt.Println(key)
  }
}

修改 map 的值 (改)


package main
import "fmt"
func main() {
    //var stu1 = make(map[string]string, 10)
    //stu1["Name"] = "張三"
    //stu1["Age"] = "18"
    //stu1["height"] = "188"
    //
    //stu1["Name"] = "張三666"//修改
    //fmt.Println(stu1)
    //同上
    var stu1 = map[string]string{
        "Name":   "張三"
        "Age":    "18"
        "height": "188" //每行都要以,結尾,
}
    stu1["Name"] = "張三666"//修改
    fmt.Println(stu1)
}

刪除 map 裏面的值


刪除 map 裏面的值需要用到delete

代碼

package main
import "fmt"
func main() {
    var stu1 = map[string]string{
        "Name":   "張三"
        "Age":    "18"
        "height": "188" //每行都要以,結尾,
}
    fmt.Println(stu1)    //map[Age:18 Name:張三 height:188]
    delete(stu1 "Name") //刪除key以及key對應的值
    fmt.Println(stu1)    //map[Age:18 height:188]
}

map 取值注意事項


map 在取值時,儘可能的判斷一下是否 key 存在

package main
import "fmt"
func main() {
  var stu1 = map[string]string{
    "Name":   "張三"
    "Age":    "18"
    "height": "188" //每行都要以,結尾,
  }
  //result := stu1["Name"]//key存在,沒問題
  //fmt.Println(result)//張三
  //result := stu1["Names"]//手一抖,key打錯了
  //fmt.Println(result)//結果爲空,顯然不是太友好
  //取值標準用法
  result ok := stu1["Name"]
  //如果key存在,ok爲true,如果key不存在,ok爲false
  fmt.Println(resultok)//張三 true
  if ok {
    fmt.Println(result)
  } else {
    fmt.Println("key不存在")
  }
}

總結


上述我們學習了 Go 基礎之 map。如果在操作過程中有任何問題,記得下面討論區留言,我們看到會第一時間解決問題。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jcpebuw-SElk0x5MYfScHg