Golang-map
map 的基本介紹
map 是 key-value 數據結構,又稱為字段或者關聯數組。類似其它編程語言的集合,在編程中是經常使用到
map 的聲明
var map 變量名 map[keytype]valuetype
key 可以是什么類型
golang 中的 map,的 key 可以是很多種類型,比如 bool, 數字,string, 指針, channel , 還可以是只包含前面幾個類型的 接口, 結構體, 數組
通 常 key 為 int 、 string
注意: slice, map 還有 function 不可以,因為這幾個沒法用 == 來判斷
valuetype 可以是什么類型
valuetype 的類型和 key 基本一樣,這里我就不再贅述了通常為: 數字(整數,浮點數),string,map,struct
map 聲明的舉例:
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
注意:聲明是不會分配內存的,初始化需要 make ,分配內存后才能賦值和使用。案例演示:
對上面代碼的說明
1)map 在使用前一定要 make
2)map 的 key 是不能重復,如果重復了,則以最后這個 key-value 為准
3)map 的 value 是可以相同的.
4)map 的 key-value 是無序
5)make 內置函數數目
map 的使用
方式一
方式二
方式三
map 使用的課堂案例
課堂練習:演示一個 key-value 的 value 是 map 的案例
比如:我們要存放 3 個學生信息, 每個學生有 name 和 sex 信息思路: map[string]map[string]string
代碼:
map 的增刪改查操作
map 增加和更新:
map["key"] = value //如果 key 還沒有,就是增加,如果 key 存在就是修改。
map 刪除: 說明:
delete(map,"key") ,delete 是一個內置函數,如果 key 存在,就刪除該 key-value,如果 key 不存在, 不操作,但是也不會報錯
細節說明
如果我們要刪除 map 的所有 key ,沒有一個專門的方法一次刪除,可以遍歷一下 key, 逐個刪除或者 map = make(...),make 一個新的,讓原來的成為垃圾,被 gc 回收
map 查找: 案例演示:
對上面代碼的說明:
說明:如果 heroes 這個 map 中存在 "no1" , 那么 findRes 就會返回 true,否則返回 false
map 遍歷:
案例演示相對復雜的 map 遍歷:該 map 的 value 又是一個 map
說明:map 的遍歷使用 for-range 的結構遍歷
map 的長度
map 切片
基本介紹
切片的數據類型如果是 map,則我們稱為 slice of map,map 切片,這樣使用則 map 個數就可以動態變化了。
案例演示
要求:使用一個 map 來記錄 monster 的信息 name 和 age, 也就是說一個 monster 對應一個 map,並且妖怪的個數可以動態的增加=>map 切片
map 排序
1)golang 中沒有一個專門的方法針對 map 的 key 進行排序
2)golang 中的 map 默認是無序的,注意也不是按照添加的順序存放的,你每次遍歷,得到的輸出可能不一樣. 【案例演示 1】
3)golang 中 map 的排序,是先將 key 進行排序,然后根據 key 值遍歷輸出即可
案例演示
map 使用細節
1)map 是引用類型,遵守引用類型傳遞的機制,在一個函數接收 map,修改后,會直接修改原來的 map 【案例演示】
2)map 的容量達到后,再想 map 增加元素,會自動擴容,並不會發生 panic,也就是說 map 能
3)map 的 value 也經常使用 struct 類型,更適合管理復雜的數據(比前面 value 是一個 map 更好),
比如 value 為 Student 結構體 【案例演示,因為還沒有學結構體,體驗一下即可】
map 的課堂練習題
1)使 用 map[string]map[string]sting 的 map 類 型
2)key: 表示用戶名,是唯一的,不可以重復
3)如果某個用戶名存在,就將其密碼修改"888888",如果不存在就增加這個用戶信息,(包括昵稱nickname 和 密碼 pwd)。
4)編寫一個函數 modifyUser(users map[string]map[string]sting, name string) 完成上述功能
代碼實現
package main import "fmt" // 1)使用 map[string]map[string]sting 的 map 類型 // 2)key: 表示用戶名,是唯一的,不可以重復 // 3)如果某個用戶名存在,就將其密碼修改"888888",如果不存在就增加這個用戶信息, // (包括昵稱 nickname 和 密碼 pwd)。 // 4)編寫一個函數 modifyUser(users map[string]map[string]sting, name string) 完成上述功能 func modifyUser(users map[string]map[string]string, name string) { //判斷 users 中是否有 name //v , ok := users[name] if users[name] != nil { //有這個用戶 users[name]["pwd"] = "888888" } else { //沒有這個用戶 users[name] = make(map[string]string, 2) users[name]["pwd"] = "888888" users[name]["nickname"] = "昵稱~" + name //示意 } } func main() { users := make(map[string]map[string]string, 10) users["smith"] = make(map[string]string, 2) users["smith"]["pwd"] = "999999" users["smith"]["nickname"] = "小花貓" modifyUser(users, "tom") modifyUser(users, "mary") modifyUser(users, "smith") fmt.Println(users) }