我无法理解此代码块的行为。我做错了什么,正确的方法应该是什么?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)
}
但我真的不建议你这样做
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报
0/150
提交
取消