一篇文章帶你瞭解 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]string,10)
stu1["Name"] = "張三"
stu1["Age"] = "18"
stu1["height"] = "188"
var stu2 = make(map[string]string,10)
stu2["Name"] = "李四"
stu2["Age"] = "20"
stu2["height"] = "170"
fmt.Println(stu1,stu2)
//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(result,ok)//張三 true
if ok {
fmt.Println(result)
} else {
fmt.Println("key不存在")
}
}
總結
上述我們學習了 Go 基礎之 map。如果在操作過程中有任何問題,記得下面討論區留言,我們看到會第一時間解決問題。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jcpebuw-SElk0x5MYfScHg