map 類似python語言中的dict(字典類型),以key-value形式儲存資料
- Key必須是支援
==
或!=
比較運算的類型,不可以是函數,map或slice
- map尋找比線性搜素快很多,但比使用索引訪問資料的類型慢100倍
map使用make()函數建立,支援 :=
賦值的簡單寫法
//基本操作func main() { var m map[int]string //定義一個map變數 m = map[int]string{} //第一種方式 m = make(map[int]string) //第二種方式:使用make m := make(map[int]string) //第三種方式make直接初始化 m[1] = "ok" //賦值一對key-value a := m[1] //擷取一個key對應的value值 delete(m, 1) //刪除map中的某一個key fmt.Println(m) fmt.Println(m) fmt.Println(a) fmt.Println(m)}/*outputmap_init----> map[]map_add----> map[1:ok]map_get----> okmap_del----> map[]*/
嵌套map: 類似python中的嵌套字典,取值,賦值時需要層層遞進 ,且每次賦值時需要對內層map執行make初始化。
範例程式碼
package mainimport "fmt"func main() { var m map[int]map[int]string //嵌套字典 m = make(map[int]map[int]string) //初始化map--最外層 m[1] = make(map[int]string) //make初始化嵌套字典,第一個鍵對應的map類型 m[1][1] = "ok" //key1_value1賦值 b, ok := m[1][1] //使用多傳回值,第二值傳回值時bool類型,如果前一個有傳回值,返回true,反之返回false fmt.Println(b, ok) fmt.Println(m) a, ok := m[2][1] //由於key2,對應的value2賦值前沒有make初始化,所以, fmt.Println(a, ok) if !ok { m[2] = make(map[int]string) } m[2][1] = "Good" a, ok = m[2][1] fmt.Println(a, ok) fmt.Println(m)}/*輸出a, ok---> ok truem ---> map[1:map[1:ok]]a, ok---> falsea, ok---> Good true //初始化後*/
for 迭代操作,類似python,dict操作,for k,v in dic.
範例程式碼
//for 迭代操作slicepackage mainimport "fmt"func main() { sum := make([]map[int]string, 5) //初始化一個slice,元素是map類型 for i := range sum { sum[i] = make(map[int]string, 1) sum[i][1] = "ok" fmt.Println(sum[i]) } fmt.Println(sum)}/*輸出i=0---> map[1:ok]i=1---> map[1:ok]i=2---> map[1:ok]i=3---> map[1:ok]i=4---> map[1:ok]sum---> [map[1:ok] map[1:ok] map[1:ok] map[1:ok] map[1:ok]]*/
map,間接排序,通過slice,對key進行排序。
範例程式碼
//間接排序,對key進行排序package mainimport "fmt"import "sort" //排序包func main() { m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d"} //這是一個map類型 s := make([]int, len(m)) //這是一個slice類型 i := 0 for k := range m { s[i] = k i ++ } sort.Ints(s) fmt.Println(s)}/*輸出[1 2 3 4]*/