- 主题:求解map的输出问题
type student struct {
name string
age int
}
func main() {
m := make(map[string]*student)
stus := []student{
{name: "小王子", age: 18},
{name: "哪吒", age: 23},
{name: "大老板", age: 9000},
}
for _,stu := range stus {
m[stu.name] = &stu
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}
为什么输出是
哪吒 => 大老板
大老板 => 大老板
小王子 => 大老板
--
FROM 111.205.43.*
stu rang stus
这里stu都是同一个实例,不是每次一个新的
这个是golang的坑,“特性”
--
FROM 223.104.38.*
我在赋值的时候加了一行打印 ,可以看出stu是在变的。
for _,stu := range stus {
m[stu.name] = &stu
fmt.Println(&stu )
}
输出为:
&{小王子 18}
&{哪吒 23}
&{大老板 9000}
大老板 => 大老板
小王子 => 大老板
哪吒 => 大老板
【 在 hothail 的大作中提到: 】
: stu rang stus
: 这里stu都是同一个实例,不是每次一个新的
: 这个是golang的坑,“特性”
--
FROM 111.205.43.*
值在变,但地址不变,你可以用%p看看地址
【 在 nic411 (难得糊涂) 的大作中提到: 】
: 我在赋值的时候加了一行打印 ,可以看出stu是在变的。
: for _,stu := range stus {
: m[stu.name] = &stu
: ...................
--
FROM 123.114.129.*
嗯,地址不变的情况下,那值为什么会变?
【 在 world 的大作中提到: 】
: 值在变,但地址不变,你可以用%p看看地址
:
--
FROM 111.205.43.*
同一个实例,但内容在变
你map上用的指针,所以最后都是在同一个地址
- 来自 水木社区APP v3.4.2
【 在 nic411 的大作中提到: 】
: 我在赋值的时候加了一行打印 ,可以看出stu是在变的。
: for _,stu := range stus {
: m[stu.name] = &stu
: fmt.Println(&stu )
: }
: 输出为:
: &{小王子 18}
: &{哪吒 23}
: &{大老板 9000}
: 大老板 => 大老板
: 小王子 => 大老板
: 哪吒 => 大老板
:
:
--
FROM 223.104.38.*
这问题问的都不知道怎么回答了
可以变,c家族的基本知识
【 在 nic411 (难得糊涂) 的大作中提到: 】
: 嗯,地址不变的情况下,那值为什么会变?
--
FROM 111.206.87.*
golang的for range第二项实际上是值拷贝,然后struct的值拷贝就是复制一份,这和java和python的class传引用是不一样的。
https://stackoverflow.com/questions/20185511/range-references-instead-values
要达到你的效果,循环内部应该用index访问slice
【 在 nic411 的大作中提到: 】
: type student struct {
: name string
: age int
: ...................
--
FROM 58.32.191.*
相似的问题
https://github.com/gopl-zh/gopl-zh.github.com/blob/master/ch5/ch5-06-1.md
【 在 nic411 (难得糊涂) 的大作中提到: 】
: type student struct {
: name string
: age int
: ...................
--
FROM 121.69.4.*
经典坑
for _,stu := range stus {
m[stu.name] = &stu
}
&stu一直指向stu这个变量,而在for循环里面,stu变量只有一个,所以m里存的都是同一个地址
对比c++,这种写法存储了for scope里的临时变量的地址,结果是未知的
go里虽然有垃圾回收,但这种写法也不安全
【 在 nic411 (难得糊涂) 的大作中提到: 】
: type student struct {
: name string
: age int
: ...................
--
FROM 106.120.46.*