今日(2023-05-26)的题目如下
以下代码有什么问题,说明原因
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)
}
}
🔑 答案解析:
遍历结果出现错误,输出结果为
zhou => wang
li => wang
wang => wang
map 中的 3 个 key 均指向数组中最后一个结构体。
foreach 中,stu 是结构体的一个拷贝副本,所以 m[stu.Name]=&stu
实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
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 i := 0; i < len(stus); i++ {
m[stus[i].Name] = &stus[i]
}
// 打印map
for k,v := range m {
fmt.Println(k ,"=>", v.Name)
}
}
zhou => zhou
li => li
wang => wang
因为存得都是同一个变量的地址,应该找一个中间变量去接受再去存入
stus := []student
改成 stus := []*student