golang中的map
阅读原文时间:2023年07月09日阅读:2

1. 声明与初始化

// map的声明与初始化  
userInfo := map\[string\]string{"name": "马亚南", "age": "18"}  
fmt.Println(userInfo)  
fmt.Println(userInfo\["name"\])  // 马亚南  
userInfo\["age"\] = "28"  
fmt.Println(userInfo)  
userInfo\["email"\] = "wupeiqi@live.com"  
fmt.Println(userInfo)

// 声明  
var userInfo2 = map\[string\]string{}  
userInfo2\["age"\] = "88"  
fmt.Println(userInfo2)

// make创建map  
data := make(map\[int\]int)  
data\[100\] = 998  
data\[200\] = 999  
fmt.Println(data)

// 只有声明,nil ,无法设置  
var row map\[int\]int  // 这种声明用于整体的赋值  
//row\["name"\] = 666  // 错误的  
row = data  
fmt.Println(row)

// new创建map, nil  
// 这种声明也是用于整体的赋值,但是赋值的是map的指针类型  
value := new(map\[int\]int)  
value = &data  
fmt.Println(\*value)

  // 注意:键不重复、键必须可哈希(int/bool/float/string/array),map是无序的

v1 := make(map\[\[2\]int\]float32)  
v1\[\[2\]int{11, 22}\] = 3.15  
v1\[\[2\]int{33, 44}\] = 2.88  
fmt.Println(v1)

2. map的长度和容量

// 1. 长度和容量  
data := map\[string\]string{"n1": "武沛齐", "n2": "alex"}  
fmt.Println(len(data))

// 2. make创建map并且指定了容量cap  
// 根据参数值10,计算出合适的容量  
// 一个map中会包含很多的桶,每个桶中可以存放8个键值对  
info := make(map\[string\]string, 10)  
info\["n1"\] = "武沛齐"  
info\["n2"\] = "alex"

fmt.Println(len(info))  
//fmt.Println(cap(info))  报错

3.  map中value的嵌套用法

// value中的嵌套  
// map的值可以使任意类型  
// 值是数组类型  
v4 := make(map\[string\]\[\]int)  
v4\["n1"\] = \[\]int{11, 22, 33, 44, 55}  
v4\["n2"\] = \[\]int{11, 22}  
fmt.Println(v4)

// 值是map类型  
v5 := make(map\[string\]map\[int\]int)  
v5\["n1"\] = map\[int\]int{1: 999, 2: 888}  
v5\["n2"\] = map\[int\]int{11: 99, 22: 88}  
fmt.Println(v5)

// 值是数组类型,值得数组中存储的是map类型  
v7 := make(map\[string\]\[2\]map\[string\]string)  
v7\["n11"\] = \[2\]map\[string\]string{{"name": "马亚南"}, {"name": "马馨彤"}}  
v7\["n12"\] = \[2\]map\[string\]string{{"age": "18"}, {"age": "28"}}  
fmt.Println(v7)

4.  map的增删改查

data := map\[string\]string{"n1": "武沛齐", "n2": "alex"}  
// 增加  
data\["n3"\] = "eric"  
// 修改  
data\["n1"\] = "武沛齐2"  
// 删除  
delete(data, "n2")  
// 查看  
fmt.Println(data\["n1"\])  
// 循环查看键值对  
for key, value := range data {  
    fmt.Println(key, value)  
}  
// 循环查看键  
for key := range data {  
    fmt.Println(key)  
}  
// 循环查看值  
for \_, value := range data {  
    fmt.Println(value)  
}

5.  map中键的嵌套

// 键不重复 & 键必须可哈希  
data1 := make(map\[int\]int)  
data2 := make(map\[bool\]int)  
data3 := make(map\[float32\]int)  
data4 := make(map\[string\]int)  
data5 := make(map\[\[2\]int\]int)  
//data6 := make(map\[\[\]int\]int)  // 错误, 不可哈希  
//data7 := make(map\[map\[int\]int\]int)  // 错误, 不可哈希  
//data8 := make(map\[ \[2\]map\[string\]string \]int)  // 错误, 虽然键是数组,但是数组里面的值是map,所以不可哈希

6.  map中变量赋值

// 变量赋值,  
map1 := map\[string\]string{"n1": "武沛齐", "n2": "alex"}  
map2 := map1

map1\["n1"\] = "哈哈"  
fmt.Println(map1)  
fmt.Println(map2)

特别提醒:map中无论是否存在扩容,都指向同一个地址