Go Map
Go Map
Alexgolang go map 声明、赋值、循环
声明格式
1
var map1 map[keytype]valuetype
未初始化的map值是nil
在声明的时候不需要知道 map 的长度,map 是可以动态增长的。声明与赋值
1
2
3
4
5
6
7
8
9
10
11
12
13var mapLit map[string]int
//var mapCreated map[string]float32
var mapAssigned map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapCreated := make(map[string]float32)
mapAssigned = mapLit
mapCreated["key1"] = 4.5
mapCreated["key2"] = 3.14159
mapAssigned["two"] = 3
fmt.Print(mapAssigned)make 操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17map1 := make(map[string][]string)
map2 := make(map[int]*[]int)
map1["aa"] = []string{"a","b","cc"}
map1["bb"] = []string{"a","b","cc"}
fmt.Println(map1)
fmt.Println(map2)
//值读取
k,v := map1["aa"]
if v == false {
panic("键值不存在")
}
fmt.Println(k,v)
delete(map1,"aa")
fmt.Println(map1)map 循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21barVal := map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
"delta": 87, "echo": 56, "foxtrot": 12,
"golf": 34, "hotel": 16, "indio": 87,
"juliet": 65, "kili": 43, "lima": 98}
newMap := make([]string,len(barVal))
i := 0
for k,_ := range barVal{
newMap[i] = k
i ++
}
newMap2 := make(map[int]string,len(barVal))
for k,v := range barVal{
newMap2[v] = k
}
fmt.Print(newMap2)
sort.Strings(newMap2)
fmt.Println(newMap)
sort.Strings(newMap)
fmt.Println(newMap)注
不使用
new
,永远用make
来构建map。如果错误的使用
new()
分配了一个引用对象,就会得到一个空引用指针,相当于声明了一个未初始化的变量并且取了它的地址1
2
3
4mapCreated := new(map[string]float32)
mapCreated["key1"] = 4.5
fmt.Println(mapCreated)
// 错误提示 invalid operation: mapCreated["key1"] (type *map[string]float32 does not support indexing)和数组不同,map 可以根据新增的 key-value 对动态的伸缩,因此它不存在固定长度或者最大限制。但是你也可以选择标明 map 的初始容量 capacity,就像这样:make(map[keytype]valuetype, cap)
当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。
判断key是否存在
1
2
3
4_, ok := map1[key1] // 如果key1存在则ok == true,否在ok为false
if _, ok := map1[key1]; ok {
// ...
}删除key
1
delete(map1, key1) //如果 key1 不存在,该操作不会产生错误