为了账号安全,请及时绑定邮箱和手机立即绑定

结构值的切片总是被最后一个索引覆盖

结构值的切片总是被最后一个索引覆盖

Go
慕尼黑8549860 2023-03-29 15:55:31
我无法理解此代码块的行为。我做错了什么,正确的方法应该是什么?import (    "fmt"    "strconv")type Record struct {    name *string}type person struct {    name string}func main() {    var Records []*Record    var persons []person    for i := 0; i < 10; i++ {        newValue := person{name: strconv.Itoa(i)}        persons = append(persons, newValue)    }    for _, personone := range persons {        newRecord := &Record{}        getName(newRecord, &personone)        Records = append(Records, newRecord)    }    for _, record := range Records {        fmt.Println(*record.name)    }}func getName(record *Record, value *person) {    record.name = &value.name}我期望此代码打印 0 到 9,但它始终打印最后一个值 9。
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

for _, personone := range persons {

在这条语句中personone是一个声明一次并在每次迭代时被覆盖的变量。

然后你在这条语句中获得它的地址getName(newRecord, &personone)

所以你每次都传递相同的地址,它在每次迭代中都会改变。

所以你最终得到了相同的值,因为你分配了相同的地址。

如何解决:如果您实际上不需要指针,请不要使用它们。

for _, personone := range persons {

    personone := personone // <-- see here

    newRecord := &Record{}

    getName(newRecord, &personone)

    Records = append(Records, newRecord)

}

但我真的不建议你这样做


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信