我无法理解此代码块的行为。我做错了什么,应该怎么做呢?
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,即最后一个值。
答案 0 :(得分:2)
for _, personone := range persons {
此语句personone
中的变量是一次声明的变量,每次迭代都会被覆盖。
然后您在此语句getName(newRecord, &personone)
中获得其地址。
因此,您每次都传递相同的地址,每次迭代都会更改该地址。
由于分配了相同的地址,所以最终得到的值是相同的。
如何解决:如果您实际上不需要指针,请不要使用。
超级肮脏的技巧是明确复制结构https://play.golang.org/p/Sp4xD88rfvE
for _, personone := range persons {
personone := personone // <-- see here
newRecord := &Record{}
getName(newRecord, &personone)
Records = append(Records, newRecord)
}
但我真的不建议您这样做