Go語言之map
阿新 • • 發佈:2022-01-15
一、map簡介
map是key-value的資料結構,基本語法:var map 變數名 map[keytype]valuetype。
keytype可以是很多種資料型別,比如 bool、int、string、指標等,通常keytype為int和string。valuetype和keytype差不多,通常valuetype為int、string、map、struct。
舉例:
var a map[int]string // key是int型別,value是string型別 var a map[string]int // key是string型別,value是int型別 var a map[string]string //key是string型別,value是string型別 var a map[string]map[string]string // key是string型別,value是map型別
注意:宣告是不會分配記憶體,初始化需要make,分配記憶體後才能賦值和使用。
package main import "fmt" func main() { // 宣告map var a map[string]string // 在使用map前需要使用make分配空間 a = make(map[string]string, 10) a["username"] = "張三" a["addr"] = "張家界" fmt.Println(a) // map[addr:張家界 username:張三] }
- map在使用前一定要make
- map的key是不能重複的,如果重複了,以最後一個key-value為準
- map的value可以重複
- map的key-value是無序的
二、map的建立
1、方式一
package main import "fmt" func main() { // 建立map的方式一 先進行make var m1 map[string]string m1 = make(map[string]string, 10) m1["usernamae"] = "張三" m1["password"] = "abc123456" fmt.Println(m1) }
2、方式二
package main import "fmt" func main() { // 建立map的方式二 m2 := make(map[string]string) m2["usernamae"] = "張三" m2["password"] = "abc123456" fmt.Println(m2) }
3、方式三
package main import "fmt" func main() { // 建立map的方式三 m3 := map[string]string{ "username": "張三", "password": "abc123", } fmt.Println(m3) }
三、map的增、刪、查、改
1、增加和修改
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", } // 增加,如果key沒有,就是增加 user["password"] = "abc123456" // 修改,如果key存在,就是修改 user["username"] = "lily" fmt.Println(user) }
2、刪除
delete(map, "key"),delete是一個內建函式,如果key存在,就刪除該key-value,如果key不存在,不操作並且也不會報錯。
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", "gender": "male", } // 刪除鍵值 delete(user, "gender") fmt.Println(user) // map[username:iveBoy] // 刪除不存在的鍵, 刪除不操作,也不會報錯 delete(user, "hobby") fmt.Println(user) }
如果需要清空整個map,通過:
- 迴圈一個個刪除
- make一個新的map,讓之前的那個成為垃圾,gc進行回收
3、查詢
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", "gender": "male", } val, isFlag := user["username"] fmt.Println(val, isFlag) // iveBoy true }
如果user中存在username這個鍵,isFlag就是true,否則就為false。
對於map的遍歷:
package main import "fmt" func main() { // 宣告一個map user := map[string]string{ "username": "iveBoy", "gender": "male", } for k, v := range user { fmt.Printf("k=%v v=%v\n", k, v) } /* k=username v=iveBoy k=gender v=male */ }
如果計算map的長度可以通過len方法進行獲取,len(user)。
四、map切片
之前學習過陣列切片,那麼map切片應該就知道是什麼意思了,對的,通過map切片可以使map的個數動態變化。舉個例子,一個班級有很多學生,而每個學生有自己的姓名、性別等資訊,那麼班級可以定義成一個切片,每個學生就是一個map。
package main import "fmt" func main() { // 定義切片 class := make([]map[string]string, 2) //可以放入2個學生資訊 // 增加第一個學生,先提前判斷是否存在這個map if class[0] == nil { class[0] = make(map[string]string) class[0]["name"] = "張三" class[0]["gender"] = "男" } // 增加第二個學生,先提前判斷是否存在這個map if class[1] == nil { class[1] = make(map[string]string) class[1]["name"] = "李四" class[1]["gender"] = "男" } // 此時只能動態新增map了,否則會越界 newStu1 := map[string]string{ "name": "王五", "gender": "男", } class = append(class, newStu1) fmt.Println(class) /* [map[gender:男 name:張三] map[gender:男 name:李四] map[gender:男 name:王五]] */ }
五、map其它注意事項
1、map排序
golang中沒有專門的方法針對map的key進行排序,所以map是無序的,如果想讓其有序可以先將map的key放入切片中進行排序,然後對應輸出對應的value。
package main import ( "fmt" "sort" ) func main() { m1 := make(map[int]int, 5) m1[1] = 5 m1[3] = 10 m1[0] = 60 // 定義一個切片 var keys []int for k, _ := range m1{ keys = append(keys, k) } // 對key進行排序 sort.Ints(keys) fmt.Println(keys) // 根據key輸出value for _, k := range keys{ fmt.Println("value=", m1[k]) } }
2、map引用型別
map是引用型別,如果函式引數是map型別,那麼在函式裡面修改的map,外面也會發生變化。
package main import "fmt" func modifyValue(m map[int]int) { m[1] = 10 } func main() { m2 := map[int]int{ 1: 6, 2: 9, } // 修改map值 modifyValue(m2) fmt.Println(m2) /* map[1:10 2:9] */ }作者:iveBoy 出處:http://www.cnblogs.com/shenjianping/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連線,否則保留追究法律責任的權利。