一 点睛
1 map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map。
2 map 的容量达到后,给 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长键值对(key-value)。
3 map 的 value 也经常使用 struct 类型,更适合管理复杂的数据。
二 代码
package main
import (
"fmt"
)
func modify(map1 map[int]int) {
map1[10] = 900
}
// 定义一个学生结构体
type Stu struct {
Name string
Age int
Address string
}
func main() {
// 一 map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map
map1 := make(map[int]int, 2)
map1[1] = 90
map1[2] = 88
// 二 map 能自动扩容
map1[10] = 1
map1[20] = 2
modify(map1)
// map1[10] = 900 ,说明 map 是引用类型
fmt.Println(map1)
// 三 map 的 value 也经常使用 struct 类型。 更适合管理复杂的数据(比前面 value 是一个 map 更好)。
// 比如 value 为 Student 结构体
// 1 map 的 key 为 学生的学号,是唯一的。
// 2 map 的 value 为 结构体,包含学生的名字,年龄, 地址。
students := make(map[string]Stu)
// 创建 2 个学生
stu1 := Stu{"tom", 18, "北京"}
stu2 := Stu{"mary", 28, "上海"}
students["no1"] = stu1
students["no2"] = stu2
fmt.Println(students)
// 遍历各个学生信息
for k, v := range students {
fmt.Printf("学生的编号是%v \n", k)
fmt.Printf("学生的名字是%v \n", v.Name)
fmt.Printf("学生的年龄是%v \n", v.Age)
fmt.Printf("学生的地址是%v \n", v.Address)
fmt.Println()
}
}
三 测试
map[1:90 2:88 10:900 20:2]
map[no1:{tom 18 北京} no2:{mary 28 上海}]
学生的编号是no1
学生的名字是tom
学生的年龄是18
学生的地址是北京
学生的编号是no2
学生的名字是mary
学生的年龄是28
学生的地址是上海