1. 程式人生 > >Go語言學習筆記(十二)之Map型別

Go語言學習筆記(十二)之Map型別

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'] = 1000
  7: 		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] = i
  6: 	}
  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=0
  2: key1=1
  3: key2=2
  4: ...

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 init
  2: 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 init
  8: 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 main
  2: 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] = 1
 14: 		} 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 = 1
  6: 	var name = "stu01"
  7: 	var score = 78.2
  8: 	var age = 18
  9: 	value, ok := stuMap[id]
 10: 	if !ok {
 11: 		value = make(map[string]interface{}, 8)
 12: 		value["name"] = name
 13: 		value["id"]	= id
 14: 		value["score"] = score
 15: 		value["age"] = age
 16: 		stuMap[id] = value
 17: 	} else {
 18: 		value["name"] = name
 19: 		value["id"]	= id
 20: 		value["score"] = score
 21: 		value["age"] = age
 22: 	}
 23: 	stuMap[id] = value
 24: 	fmt.Println(stuMap[1])
 25: }
 26: func main () {
 27: 	stu_info()
 28: }
  1: >>> map[score:78.2 age:18 name:stu01 id:1]