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

我无法理解此代码块的行为。我做错了什么,正确的方法应该是什么?


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。


慕尼黑8549860
浏览 90回答 1
1回答

MMTTMM

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)}但我真的不建议你这样做
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go