golang中的map
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中无论是否存在扩容,都指向同一个地址