Map
- 什么是 map
- 如何創(chuàng)建 map
- map 的操作
一句話概括為 map 是一種常見數(shù)據(jù)結(jié)構(gòu)奴迅,并可提供鍵值查詢能力的無序集合天梧。map 中的 key 和 value 需要是同一類型的數(shù)據(jù)步鉴。但如果 key 為接口類型可以接受多種類型作為 value。
創(chuàng)建和填充 map
m := map[string]string{
"name":"golang basic",
"category":"golang",
}
fmt.Println(m)
map[category:golang name:golang basic]
m := map[[]int]string{}
./main.go:25:7: invalid map key type []int
slice 是不可以作為 map 的 key 來使用而數(shù)組卻可以做map 的 key 來使用仁连。
m := map[[3]int]string{}
這樣就沒有問題了满葛。
第二種創(chuàng)建 map 方式,是通過 make 來創(chuàng)建 map 這時候我們可以無需賦值琐驴。在 Go 語言中內(nèi)置的make()
函數(shù)可用來創(chuàng)建 slice俘种、map 和 channel。通過 make 創(chuàng)建的 map 為一個空 map绝淡。并且會預(yù)先申請足夠的內(nèi)存宙刘,并隨著加入數(shù)據(jù)自動進行擴容。
m2 := make(map[string]int) // m2 == empty map
map[]
var m3 map[string]int // m3 == nil
這里創(chuàng)建 m2 和 m3 的形式不同但是打印都輸出 map[],其實這兩種創(chuàng)建方式創(chuàng)建出來 map 也是略有不同 m2 為 empty map 和 m3 為 nil牢酵。在 go 語言中 nil 與 java 這樣語言 null 是不同悬包,go 語言 nil 是可以參加運算的。
列出幾種創(chuàng)建 map
var a map[string][]int // key string val []int slice
var b map[string][4]int // key string val [4]int slice
var c map[[4]int]string // 將 [4]int 映射到 字符串
var d map[int]map[string]int
tuts := map[string]int{
"angular base": 10,
"react base" :12,
"vue base" : 10,
}
我們?nèi)绾胃鶕?jù) key 獲取 map 的值呢馍乙,很簡單
fmt.Println(tuts["angular base"]) // 10
map 添加元素也相對比較簡單和直觀布近。
tuts["golang base"] = 20
tuts["rust base"] = 30
fmt.Println(tuts["golang base"])
map 可以作為 map 的值而不能作為 map 的 key 來使用
map[] map[] map[] map[]
map 的 key
- map 使用hashmap 必須可以比較相等
- 除了 slice, map, function 的內(nèi)建類型都可以作為 key
- struct 類型不包含上述字段垫释,也可以作為key
遍歷 map
for k, v := range m{
fmt.Println(k,v)
}
這里 map 是 hashMap 所有 key 是無序,每一次輸出key順序是不一樣
根據(jù) key 獲取 value
tutName := m["name"]
如果將 key 輸入錯誤吊输,會返回一空值
categoryName := m["cate"]
那么如何判斷字符串是否存在饶号,通過 m[key] 返回第二個參數(shù)來判斷是否存在 key 值
tutName,ok := m["name"]
fmt.Println(tutName,ok)
categoryName,ok := m["cate"]
fmt.Println(categoryName,ok)
如果第二個參數(shù) true 表示該 key 是存在 map 中,
golang basic true
false
map 在函數(shù)中是作為引用來使用
func foo(a map[string]int){
a["Alex"] = 9
}
x := make(map[string]int)
// x["Alex"] = 9
foo(x)
y := x["Alex"]
fmt.Println(y) //9
獲取 map 的長度
fmt.Println(len(tuts))
map 中刪除屬性
可以用 delete 函數(shù)來刪除 map 的一個 key季蚂,我們判斷 map 的 key 是否被刪除可以通過name, ok := m["name"]
第二個返回值來判斷茫船,如果 ok 為真表示 map 中存在該 key 相反表示 map 并不存在該 key。
fmt.Println("delete valuse")
name, ok := m["name"]
fmt.Println(name,ok) //golang basic true
delete(m,"name")
name, ok= m["name"]
fmt.Println(name,ok)// false
也可以放置占位符形式接收返回值扭屁。
_, ok := tuts["scala base"]
fmt.Println(ok)