目錄
一、map
1.基本介紹
2.宣告基本語法
3.宣告的舉例
二、map 的使用
1.map宣告三種方式
2.map[string]map[string]string使用案例
三、map 的增刪改查操作
1.map 增加和更新
2.map 洗掉
3.map 查找
四、map的其他操作
1.map 遍歷:
2.map 的長度
3.map 切片
1.基本介紹
2.案例
4.map 排序
1.基本介紹
2.案例演示
五、map 使用細節
總結
一、map
1.基本介紹
map 是 key-value 資料結構,又稱為欄位或者關聯陣列,類似其它編程語言的集合, 在編程中是經常使用到
2.宣告基本語法
var map 變數名 map[keytype]valuetype
- key 可以是什么型別 :golang 中的 map,的 key 可以是很多種型別,比如 bool, 數字,string, 指標, channel , 還可以是只 包含前面幾個型別的 介面, 結構體, 陣列
- 通常 key 為 int 、string 注意: slice, map 還有 function 不可以,因為這幾個沒法用 == 來判斷
- valuetype 可以是什么型別: valuetype 的型別和 key 基本一樣,這里我就不再贅述了 通常為: 數字(整數,浮點數),string,map,struct
3.宣告的舉例
map 宣告的舉例:
- var a map[string]string
- var a map[string]int
- var a map[int]string
- var a map[string]map[string]string
- 注意:宣告是不會分配記憶體的,初始化需要 make ,分配記憶體后才能賦值和使用
package main
import (
"fmt"
)
func main(){
//map的宣告注意事項
var a map[string]string
// 在使用map前,首先要make 分配資料空間,
a = make(map[string]string,10)
a["no1"] = "松江"
a["no2"] = "吳用"
a["no3"] = "武松"
a["no1"] = "吳用"
fmt.Println(a)
}

注意事項:
1.在使用前必須make 否則編譯不通過,因為沒有空間,所以必須先申請空間
2.上面的代碼和結果說明了map中 key值是不可以重復的,(若重復了以最后一個key-value為主)value值可以重復
make內置函式

二、map 的使用
1.map宣告三種方式
方式1:
var a map[string]string
// 在使用map前,首先要make 分配資料空間,
a = make(map[string]string,10)
a["no3"] = "松江"
a["no1"] = "吳用"
a["no3"] = "武松"
a["no2"] = "吳用"
fmt.Println(a)
方式2:
//第二種方式
cities := make(map[string]string)
cities["no1"] = "上海"
cities["no2"] = "西安"
cities["no3"] = "天津"
fmt.Println(cities)
方式3:
//第三種方式
heroes := map[string]string{
"no1" : "chengdu", // 注意不能少了” ,“號
"no2" : "beijing",
"no3" : "wuhan",
}
fmt.Println(heroes)
2.map[string]map[string]string使用案例
- 演示一個 key-value 的 value 是 map 的案例
- 比如:我們要存放 3 個學生資訊, 每個學生有 name 和 sex 資訊
- 思路: map[string]map[string]string

三、map 的增刪改查操作
1.map 增加和更新
map["key"] = value //如果 key 還沒有,就是增加,如果 key 存在就是修改
cities := make(map[string]string)
cities["no1"] = "上海"
cities["no2"] = "西安"
cities["no3"] = "天津"
fmt.Println(cities)
//因為no3 這個key值已經存在,所以下面的就是修改,若無就是增加
cities["no3"] = "天津..."
fmt.Println(cities)
2.map 洗掉
delete(map,"key") ,delete 是一個內置函式,如果 key 存在,就洗掉該 key-value,如果 key 不存在, 不操作,但是也不會報錯

//洗掉演示
delete(cities,"no1")
fmt.Println(cities)
//當delete指定的key不存在時,洗掉不操作,也不會報錯
delete(cities,"no4")
fmt.Println(cities)
如果我們要洗掉 map 的所有 key ,沒有一個專門的方法一次洗掉,可以遍歷一下 key, 逐個洗掉 或者 map = make(...),make 一個新的,讓原來的成為垃圾,被 gc 回收
注意如果要全部洗掉,兩種方式
- 遍歷所有key,逐一洗掉
- 直接make一個新空間,
//如果希望一次性洗掉所有 兩種方式
//1.遍歷所有key,逐一洗掉
//2.直接make一個新空間,
cities := make(map[string]string)
fmt.Println(cities)
3.map 查找
//演示map查找
val , ok :=cities["no2"]
if ok{
fmt.Printf("找到了 值為%v",val)
}else{
fmt.Printf("沒有找到")
}
說明:如果 cities 這個 map 中存在 "no2" , 那么 findRes 就會回傳 true,否則回傳 flase
四、map的其他操作
1.map 遍歷:
案例演示相對復雜的 map 遍歷:該 map 的 value 又是一個 map
說明:map 的遍歷使用 for-range 的結構遍歷
package main
import (
"fmt"
)
func main(){
cities := make(map[string]string)
cities["no1"] = "上海"
cities["no2"] = "西安"
cities["no3"] = "天津"
for k , v :=range cities{
fmt.Printf("k=%v v=%v \n",k,v)
}
}

復雜遍歷案例

2.map 的長度

package main
import (
"fmt"
)
func main(){
cities := make(map[string]string)
cities["no1"] = "上海"
cities["no2"] = "西安"
cities["no3"] = "天津"
for k , v :=range cities{
fmt.Printf("k=%v v=%v \n",k,v)
}
fmt.Println(len(cities)) //3
}
3.map 切片
1.基本介紹
切片的資料型別如果是 map,則我們稱為 slice of map,map 切片,這樣使用則 map 個數就可以動 態變化了,
2.案例


package main
import (
"fmt"
)
func main(){
monsters := make([]map[string]string,2)
if monsters[0] == nil{
monsters[0] = make(map[string]string,2)
monsters[0]["name"] = "牛魔王"
monsters[0]["age"] = "500"
}
if monsters[1] == nil{
monsters[1] = make(map[string]string,2)
monsters[1]["name"] = "玉兔精"
monsters[1]["age"] = "400"
}
// 這里如果我們繼續使用monsters[2] 肯定越界 所以我們需要動態追加
//這里我們需要使用切片的append函式,可以增加monsters
//演示:
newMonsters := map[string]string{
"name" : "火云邪神",
"age" : "200",
}
//追加
monsters = append(monsters,newMonsters)
fmt.Println(monsters)
}

4.map 排序
1.基本介紹
- golang 中沒有一個專門的方法針對 map 的 key 進行排序
- golang 中的 map 默認是無序的,注意也不是按照添加的順序存放的,你每次遍歷,得到的輸出 可能不一樣.
- golang 中 map 的排序,是先將 key 進行排序,然后根據 key 值遍
2.案例演示
map1 := make(map[int]int,100)
map1[10] = 100
map1[1] = 13
map1[4] = 56
map1[8] = 90
for k , v :=range map1{
fmt.Printf("k=%v v=%v \n",k , v) //無序的
}

沒有排序 下來進行排序
//如果按照map的key的順序進行排序輸出
//1. 先將map的key 放入到切片中
//2.對切片排序
//3. 遍歷切片,然后按照key來輸出map的值
var keys[]int
for k , _ := range map1{
keys = append(keys,k)
}
//排序
sort.Ints(keys)
fmt.Println(keys) //輸出key值
for _ , k :=range keys{
fmt.Printf("map1[%v]=%v \n",k,map1[k])
}
五、map 使用細節
1) map 是參考型別,遵守參考型別傳遞的機制,在一個函式接收 map,修改后,會直接修改原來 的 map
package main
import (
"fmt"
)
func modify(map2 map[int]int ){
map2[10] = 900
}
func main(){
//map是參考型別,遵守參考型別傳遞機制,在一個函式接受map
//修改后,會直接修改原來的map
map1 := make(map[int]int)
map1[1] = 90
map1[2] = 88
map1[10] = 1
map1[20] = 2
modify(map1)
fmt. Println(map1)
}

2)map 的容量達到后,再想 map 增加元素,會自動擴容,并不會發生 panic,也就是說 map 能動 態的增長 鍵值對(key-value)

3) map 的 value 也經常使用 struct 型別,更適合管理復雜的資料(比前面 value是一個 map 更好)

總結
以上是map的一些介紹 從map的定義到一些增刪查改的操作,再到一些使用上的細節,相信大家一定有一個很清楚的了解,如果文章有任何錯誤的地方,歡迎指正,感謝閱讀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404186.html
標籤:其他
上一篇:【前端】Jquery詳細教程
