go開發手冊: https://studygolang.com/pkgdoc
一、什么是map
有資料翻譯成地圖、映射或字典,但是大多數習慣上翻譯成集合,
1、map是Go中的內置型別,它將一個值與一個鍵關聯起來,可以使用相應的鍵檢索值,
- map是一種無序的鍵值對(key-value pair)的集合,map通過key來快速檢索資料,key類似于索引,指向相應的value值,
- map是一種集合,所以可以像遍歷陣列或切片那樣去遍歷它,不過map是無序的,所以無法決
2、使用map的注意細節:
• map是無序的,每次列印出來的map都會不一樣,它不能通過index獲取,而必須通過key獲取;
• map的長度是不固定的,和slice-樣可以擴展,內置的len()函式同樣適用于map,回傳map擁有的鍵值對的數量,但是map不能通過cap()函式計算容量(或者說cap()函式的引數不可以是map);
•同_tmap中key必須保證唯_,key的資料型別必須是可參與比較運算的型別,也就是支持==或!=操作的型別,如布爾型、整數型、浮點型、字串型、陣列,對于切片、函式等參考型別則不能作為鍵的型別;
(Invalid map key type: must not be must not be a function , map or slice)
• map的value可以是任何資料型別,
•和slice—樣,map也是一種參考型別;
二、map的使用
1、map的宣告
map中key可以是:int、float、bool、string、陣列; 一定不可以是:切片、函式、map
package mainimport ( "fmt")func main() { //map的宣告 一(var 變數名 map[key的型別]value的型別 ) var map1 map[string]string fmt.Printf("%T,%v,%v \n", map1, map1, map1 == nil) //map[string]string,map[],true //map宣告 二 map2 := make(map[string]string) fmt.Printf("%T,%v,%v \n", map2, map2, map2 == nil) //map[string]string,map[],false}
2、map的初始化
package mainimport ( "fmt")func main() { //map的宣告 一(var 變數名 map[key的型別]value的型別 ) var map1 map[string]string fmt.Println("map的長度", len(map1)) //在宣告的同時初始化資料 var map2 = map[string]string{ "sz": "張三", "ls": "李四", } fmt.Println("map=", map2) //先宣告 然后再賦值 map3 := make(map[string]string) map3["ww"] = "王五" map3["lb"] = "劉備" fmt.Println("map=", map3)}
3、map的CURD
package mainimport ( "fmt")func main() { //=========在宣告的同時初始化資料 var map2 = map[string]string{ "zs": "張三", "ls": "李四", } //=========map添加資料 map2["lb"] = "劉備" //=========map的遍歷 for k, v := range map2 { fmt.Println("k=", k, " v=", v) } //=========根據key檢測值是否存在 v, ok := map2["sz"] fmt.Println("v=", v, " ok=", ok) //v= 張三 ok= true v1, ok1 := map2["sssss"] fmt.Println("v=", v1, " ok=", ok1) //v= ok= false if value, key := map2["lb"]; key { fmt.Println("元素的值=", value) } //=========修改map中key對應的value map2["zs"] = "zhangshan" fmt.Println("update=", map2) //=========delete 洗掉map中的元素 //該函式沒有回傳值,如果洗掉不存在的key程式不會報錯 fmt.Println("delete befor=", map2) delete(map2, "lb") delete(map2, "HHHHHHHHHHHHHH") fmt.Println("delete after=", map2) //=========清空map (go語言沒有清空的函式,如果要清空,就是直接賦新的map) map2 = map[string]string{} //map2 = make(map[string]string) fmt.Println("clear=", map2) //map是參考型別 }
4、map是參考型別
package mainimport ( "fmt" "container/list")func main() { //初始薪資 salary := map[string]float64 { "Steven":15000, "Josh":20000, "Daniel":5000, } fmt.Println("初始薪資",salary) //調薪后 newSalary := salary newSalary["Daniel"] = 8000 fmt.Println("調薪后:" , newSalary) fmt.Println("原始薪資salary是否受影響:" , salary) //定期漲薪 changeSalary(salary) fmt.Println("原始薪資salary是否受影響:" , salary)}//定期漲薪func changeSalary(m map[string]float64) { for k :=range m { m[k] *= 1.1 }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67379.html
標籤:Go
上一篇:go map資料結構和原始碼詳解
下一篇:GO基礎之結構體
