introduction
key-value的數據結構,又名關聯數組或是hash table
在python中被稱為字典(dictionary)
- map本身是無序的
- map的key是唯一的
- map為引用類型
聲明
1 | var 變量名 map[key的類型]value的類型 |
- 聲明是不會分配內存的,只是聲明變量為map類型而已
- 必須初始化(
make
)才能使用 - 若無初始化,表示此變量並無內存空間存放,操作會發生
panic
example 1
1 | var a map[string]string |
example 2
1 | var map[string]map[string]string |
- key為
string
類型 - value為
map
類型
初始化
make
語法
1 | 變量 := make(map[key的類型]值的類型,容量) |
- 容量可以不填寫,會有一個默認map所儲存的容量值,如超過容量值,會觸發內存重新分配 (效能降低)
- 容量值有填寫的情況下,會提前分配一個相對應容量值的內存空間 (效能較高)
- 可根據自己的需求定義容量會獲得比較好的效能
- 如果儲存的值一直沒有超過初始化的容量,就不會觸發內存重新分配,性能最高
1 | var a map[string]string |
可簡寫成1
a := make(map[string]string)
{}初始化
1 | var a map[string]string |
可簡寫成1
a := map[string]string{}
聲明時並初始化
1 | var a map[string]string = map[string]string{"1":"apple","2":"banana"} |
添加鍵值對、更新鍵值
語法
1 | 變量[key] = value |
example
1 | package main |
result
1 | initialize map[1:apple 2:banana] |
操作嵌套的map
- 在對第一層
key1
賦值時,其value也為map
類型,不要忘記將value的map
類型初始化 - 對第一層的其他key賦值時,value需再重新初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25package main
import "fmt"
func main(){
a := make(map[string]map[string]string)
a["key1"]= make(map[string]string)
//賦值
a["key1"]["key1_1"] = "value1"
a["key1"]["key1_2"] = "value2"
//對第一層其他key賦值,需再重新初始化
a["key2"] = make(map[string]string)
//才能賦值
a["key2"]["key2_1"] = "value3"
//覺得以上稍嫌麻煩
//你可以直接使用{}方法直接多個賦值
a["key3"] = map[string]string{"key3_1":"value4","key3_2":"value5"}
fmt.Println(a)
}
result
1 | map[key1:map[key1_1:value1 key1_2:value2] key2:map[key2_1:value3] key3:map[key3_1:value4 key3_2:value5]] |
查找操作
查找對應的key是不是在map
中
語法
1 | value,ok := name[key] |
example
1 | package main |
result
1 | key4_status: false key4_value: |
要是
key
存在於map
類型的name
中ok
會返回true
且value
會返回key對應的值要是
key
不存在於name
中ok
會返回false
且value
為空
遍歷
使用for range
遍歷
example
1 | package main |
result
1 | key1 : value1 |
刪除 (delete)
刪除map中的鍵使用delete
內置函數刪除
語法: delete(map,key)
example
1 | package main |
result
1 | map[key2:value2 key3:value3] |
求長度
求map的長度使用len(map)
example
1 | package main |
result
1 | length of map: 3 |
map為引用類型
1 | package main |
result
1 | Before Modify: |
map類型的切片是允許的
比較少人使用
example 1
1 | package main |
[1] 使用type
將map[int]string
類型取一個為m
的別名
result
1 | [map[1:A] map[2:B] map[3:C]] |
example 2
1 | package main |
[1] 用make
初始化一切片
[2] 搭配for
循環將切片裡map
類型的元素 逐一使用make
初始化
result
1 | [map[1:A] map[2:B] map[3:C]] |
map中的排序
- map中的key是無序的
- 並沒有函數可以直接傳入map類型進行排序
- 先獲取map所有key,把key進行排序
- 按照排序好的key對map進行遍歷
1 | package main |
result
1 | key1 - value9 |
map反轉 (鍵值互換)
初始化另一個map將key及value互換即可
- 新初始化的map其key與value的類型也必須相反
1 | package main |
result
1 | map[value3:3 value1:1 value2:2] |