map 使用细节
- map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map
func modify(map1 map[int]int) {
map1[10] = 900
}
func main() {
//map是引用类型,遵守引用类型传递的机制,在一个函数接收map,
//修改后,会直接修改原来的map
map1 := make(map[int]int)
map1[1] = 90
map1[2] = 88
map1[10] = 1
map1[20] = 2
modify(map1)
fmt.Println(map1)
}
![](https://img-blog.csdnimg.cn/2020070117425674.png)
- 结果 map1[10] = 900 ,说明map是引用类型
- map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长 键值对(key-value)
map1 := make(map[int]int, 2)
map1[1] = 90
map1[2] = 88
map1[10] = 1
map1[20] = 2
- map 的 value 也经常使用 struct 类型,更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体
1.map 的 key 为 学生的学号,是唯一的
2.map 的 value为结构体,包含学生的 名字,年龄, 地址
//定义一个学生结构体
type Stu struct {
Name string
Age int
Address string
}
func main(){
students := make(map[string]Stu, 10)
//创建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()
}
}
![](https://img-blog.csdnimg.cn/20200701175133751.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzQxMzg4NTMz,size_16,color_FFFFFF,t_70)
综合案例
使用 map[string]map[string]sting 的 map 类型
key: 表示用户名,是唯一的,不可以重复
如果某个用户名存在,就将其密码修改"888888",如果不存在就增加这个用户信息,(包括昵称nickname 和密码 pwd)。
编写一个函数 modifyUser(users map[string]map[string]sting, name string) 完成上述功能
func modifyUser(users map[string]map[string]string, name string) {
//判断users中是否有name
//v , ok := users[name]
if users[name] != nil {
//有这个用户
users[name]["pwd"] = "888888"
} else {
//没有这个用户
users[name] = make(map[string]string, 2)
users[name]["pwd"] = "888888"
users[name]["nickname"] = "昵称~" + name //示意
}
}
func main() {
users := make(map[string]map[string]string, 10)
users["smith"] = make(map[string]string, 2)
users["smith"]["pwd"] = "999999"
users["smith"]["nickname"] = "小花猫"
modifyUser(users, "tom")
modifyUser(users, "mary")
modifyUser(users, "smith")
fmt.Println(users)
}
![](https://img-blog.csdnimg.cn/20200701180205924.png)