Go每日一题 今日(2025-03-23) 的题目如下

4472 次点击 · 4 赞 ·大约8小时之前 开始浏览   · 来源「Golang修养之路」

以下代码有什么问题,说明原因

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)
    }
}
4472 阅读
42 回复
Ge-go
Ge-go · #1 · 3年之前

因为存得都是同一个变量的地址,应该找一个中间变量去接受再去存入 image.png

Natsuwau
Natsuwau · #2 · 3年之前

学到了

Esac_Ben
Esac_Ben · #3 · 3年之前

Mark.

feiyang
feiyang · #4 · 3年之前

打卡

brothersam
brothersam · #5 · 3年之前

能运行,但是结果是三个=>wang。因为 m[stu.Name] = &stu 是引用,循环到最后,最后指向的是最后一个、

henry1
henry1 · #6 · 3年之前

range

fulltimelink
fulltimelink · #7 · 3年之前

mark

euibieur894
euibieur894 · #8 · 3年之前

打卡

don178
don178 · #9 · 3年之前

打卡

Rob1n
Rob1n · #10 · 3年之前

mark 拷贝副本 同一指针的问题

feiyang
feiyang · #11 · 3年之前

for range 拷贝副本

NovaChaos
NovaChaos · #12 · 3年之前

mk

brothersam
brothersam · #13 · 3年之前

for _, stu := range stus { stu每次循环是同一个变量,这里这个变量是指针,最后会得到3个最后一个切片元素

mingtop
mingtop · #14 · 3年之前

for range 使用变量先接收,再赋值

feiyang
feiyang · #15 · 2年之前

for range 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。

NovaChaos
NovaChaos · #16 · 2年之前

mk

YuPeng
YuPeng · #17 · 2年之前

打卡

feiyang
feiyang · #18 · 2年之前

foreach 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。

huangyf168
huangyf168 · #19 · 2年之前

打卡

QRQRQRqrqr
QRQRQRqrqr · #20 · 2年之前

image.png image.png

ku666
ku666 · #21 · 2年之前

stus := []student 改成stus := []*student

wzbwzt
wzbwzt · #22 · 2年之前

1

beenleqi
beenleqi · #23 · 2年之前

打卡

feiyang
feiyang · #24 · 2年之前
// 遍历结构体数组,依次赋值给map
for i := 0; i < len(stus); i++  {
    m[stus[i].Name] = &stus[i]
}
flyZ
flyZ · #25 · 2年之前

make 值被替换

528548004
528548004 · #26 · 2年之前

mark

YuPeng
YuPeng · #27 · 2年之前

mark

hasbug
hasbug · #28 · 2年之前

mark

huangyf168
huangyf168 · #29 · 2年之前

mark

528548004
528548004 · #30 · 2年之前

mark

1174en
1174en · #31 · 2年之前

因为存得都是同一个变量的地址,应该找一个中间变量去接受再去存入

huangyf168
huangyf168 · #32 · 2年之前

mark

TimLiuDream
TimLiuDream · #33 · 2年之前

mark

hasbug
hasbug · #34 · 2年之前

mark

zhangwei_go
zhangwei_go · #35 · 大约1年之前

遍历结果出现错误,输出结果为

zhou => wang li => wang wang => wang map 中的 3 个 key 均指向数组中最后一个结构体。

分析

foreach 中,stu 是结构体的一个拷贝副本,所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。

zhangwei_go
zhangwei_go · #36 · 大约1年之前

for range知识点考察

Qmfuser
Qmfuser · #37 · 大约1年之前

mark

BigBigGopher
BigBigGopher · #38 · 大约1年之前

mk

a406299736
a406299736 · #39 · 大约1年之前

mark

BigBigGopher
BigBigGopher · #40 · 11月之前

m[stu.Name]=&stu实际上一致指向同一个指针

YuPeng
YuPeng · #41 · 11月之前

go1.22 已经可以正常打印了

feiyang
feiyang · #42 · 7月之前

go1.22 之后已经可以正常打印了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传