Go語言學習筆記(十二)之Map型別
阿新 • • 發佈:2018-12-20
17.Map型別
Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索資料,key 類似於索引,指向資料的值。
Map 是一種集合,所以我們可以像迭代陣列和切片那樣迭代它。不過,Map 是無序的,我們無法決定它的返回順序,這是因為 Map 是使用 hash 表來實現的。
//map是一個引用型別,必須初始化才能使用,否則會panic
// var a map[key型別]value型別
1: var a map[string]int
2: var b map[int]string
3: var c map[float32]string
1: func main() {2: var a map[string]int
3: if a == nil {
4: a = make(map[string]int, 16)
5: fmt.Printf("a=%v\n", a)
6: a['stu01'] = 10007: fmt.Printf("a=%v\n", a)
8: }9: }
如果不初始化 map,那麼就會建立一個 nil map。nil map 不能用來存放鍵值對.也可以宣告時就初始化
1: func main() {2: a := map[string]int {
3: "steve":12000,
4: "jamie":15000,
5: }6: a["mike"] = 9000
7: }
基本操作
1: b:="jamie"
2: fmt.Println("Salary of", b, "is", a[b])
1: >>> Salary of jamie is 15000
判定map指定的key是否存在,固定語法
1: value, ok:=map[key]2: c:="steve"
3: value, ok:=a[b]4: if ok == true {
5: fmt.Println("Salary of" b "is" value)6: }else {
7: fmt.Println("key b does not exist")
8: }
map刪除元素
1: delete(a, "steve")
2: 全部刪除3: for key, _ := range a {4: delete(a, key)5: }
map拷貝
1: b := a
// map屬於引用型別,裡面儲存的都是地址,將a賦值給b,兩者指定的是同一map,修改b同時也會修改a
map進行排序:雖然預設是無序的,如果有需要,可以按照有序來進行遍歷
1: func main() {2: var a map[string]int = make(map[string]int, 10)3: for i :=0; i<10; i++ {4: key := fmt.Sprintf("key%d", i)
5: a[key] = i6: }7: var keys []string
8: for key, _ := range a {9: keys = append(keys, key)10: }11: sort.Strings(keys)12: for _, key := range keys {13: fmt.Printf("%s=%d\n", key, a[key])
14: }15: }
1: >>> key0=02: key1=13: key2=24: ...
map型別的切片
一個稍微複雜的巢狀例子
1: func main() {2: var mapSlice []map[string]int
3: mapSlice = make([]map[string]int, 5)
4: fmt.Println("before map init")
5: for index,value := range mapSlice {
6: fmt.Printf("index:%d value:%v\n", index, value)7: }8: mapSlice[0] = make(map[string]int, 10)
9: mapSlice[0]["a"] = 1000
10: mapSlice[0]["b"] = 2000
11: mapSlice[0]["c"] = 3000
12: mapSlice[0]["d"] = 4000
13: fmt.Println("after map init")
14: for index, value := range mapSlice {
15: fmt.Printf("index:%d value:%v\n", index, value)16: }17: }
1: >>> before map init2: index:0 value:map[]
3: index:1 value:map[]
4: index:2 value:map[]
5: index:3 value:map[]
6: index:4 value:map[]
7: after map init8: index:0 value:map[a:1000 b:2000 c:3000 d:4000]
9: index:1 value:map[]
10: index:2 value:map[]
11: index:3 value:map[]
12: index:4 value:map[]
練習
1.統計一個字串每個單詞出現的次數。比如:s = "how do you do"輸出how = 1 do = 2 you = 1
1: package main2: import (
3: "fmt"
4: "strings"
5: )6: var s = "how do you do what are you doing"
7: func statWords (str string) map[string]int {8: var result map[string]int = make(map[string]int, 128)9: words := strings.Split(str, " ")
10: for _, v := range words {11: count, ok := result[v]
12: if !ok {
13: result[v] = 114: } else {
15: result[v] = count + 1
16: }17: }18: return result
19: }20: func main() {21: result := statWords(s)22: fmt.Println(result)23: }
1: >>> map[do:2 doing:1 you:2 how:1 what:1 are:1]
2.實現學生資訊的儲存,學生有id,年齡,分數等資訊。需要非常方便的通過id查詢到對應學生的資訊。
1: func stu_info () {2: var stuMap map[int]map[string]interface{}
3: //id=1 name=stu01 score=78.2 age=18
4: stuMap = make(map[int]map[string]interface{}, 16)
5: var id = 16: var name = "stu01"7: var score = 78.28: var age = 189: value, ok := stuMap[id]10: if !ok {
11: value = make(map[string]interface{}, 8)
12: value["name"] = name13: value["id"] = id
14: value["score"] = score
15: value["age"] = age
16: stuMap[id] = value17: } else {
18: value["name"] = name19: value["id"] = id
20: value["score"] = score
21: value["age"] = age
22: }23: stuMap[id] = value24: fmt.Println(stuMap[1])25: }26: func main () {27: stu_info()28: }
1: >>> map[score:78.2 age:18 name:stu01 id:1]