亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結構值的切片總是被最后一個索引覆蓋

結構值的切片總是被最后一個索引覆蓋

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 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號