以下代码有什么问题,说明原因
package main
import (
"fmt"
)
type student struct {
Name string
Age int
}
func main() {
//定义map
m := make(map[string]*student)
//定义student数组
stus := []student{
{Name: "zhou", Age: 24},
{Name: "li", Age: 23},
{Name: "wang", Age: 22},
}
//将数组依次添加到map中
for _, stu := range stus {
m[stu.Name] = &stu
}
//打印map
for k,v := range m {
fmt.Println(k ,"=>", v.Name)
}
}
因为存得都是同一个变量的地址,应该找一个中间变量去接受再去存入
学到了
Mark.
打卡
能运行,但是结果是三个=>wang。因为 m[stu.Name] = &stu 是引用,循环到最后,最后指向的是最后一个、
range
mark
打卡
打卡
mark 拷贝副本 同一指针的问题
for range 拷贝副本
mk
for _, stu := range stus { stu每次循环是同一个变量,这里这个变量是指针,最后会得到3个最后一个切片元素
for range 使用变量先接收,再赋值
for range 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
mk
打卡
foreach 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
打卡
stus := []student 改成stus := []*student
1
打卡
make 值被替换
mark
mark
mark
mark
mark
因为存得都是同一个变量的地址,应该找一个中间变量去接受再去存入
mark
mark
mark
遍历结果出现错误,输出结果为
zhou => wang li => wang wang => wang map 中的 3 个 key 均指向数组中最后一个结构体。
分析
foreach 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
for range知识点考察
mark
mk
mark
m[stu.Name]=&stu实际上一致指向同一个指针
go1.22 已经可以正常打印了
go1.22 之后已经可以正常打印了