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

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

指向具有略微不同值的結構的指針的重復切片

指向具有略微不同值的結構的指針的重復切片

Go
慕少森 2022-07-04 10:42:07
給定兩個嵌套類型type Inner struct {  InnerVal int}type Outer struct {  InnerStruct *Inner  OuterVal int}我需要復制一個指針切片OuteroriginalSlice := []*Outer{<plenty_of_items>}本身,但在重復項中更新了字段值,包括Outer.InnerStruct.InnerVal.為此,我創建了一個類型和長度originalSlice與originalSliceduplicateSlice := make([]*Outer, len(originalSlice))for _, originalItem := range originalSlice {  duplicateSlice = append(duplicateSlice, &Outer{    InnerStruct: &Inner{      InnerVal: originalItem.InnerStruct.InnerVal + 1    },    OuterVal: originalItem.OuterVal + 1,  })}originalSlice = append(originalSlice, duplicateSlice...)雖然這很冗長,可以跟隨周圍的指針,或者我認為,當在 as 之后立即傳遞給函數nowDoubledSlice并通過循環訪問時someOtherSlice := make([]*types.Inner, len(nowDoubledSlice))for i, doubledItem := range nowDoubledSlice {  someOtherSlice[i] = doubledItem.InnerStruct}我得到一個運行時錯誤:無效的內存地址或 nil 指針取消引用這是為什么?是否有更優雅或慣用的方法來復制指向結構的指針切片,同時更改重復項的字段?
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

這與您的指針創建無關,這是您的切片分配。這一行:


duplicateSlice := make([]*Outer, len(originalSlice))

創建一個新的長度切片len(originalSlice),填充零值元素。您可能想要的是:


duplicateSlice := make([]*Outer, 0, len(originalSlice))

創建一個長度0但容量為的切片len(originalSlice)。這很好用,你可以在這里看到。


或者,您可以保留make([]*Outer, len(originalSlice))并使用索引而不是append在循環中:


for i, originalItem := range originalSlice {

    duplicateSlice[i] =&Outer{

        InnerStruct: &Inner{

            InnerVal: originalItem.InnerStruct.InnerVal + 1,

        },

        OuterVal: originalItem.OuterVal + 1,

    }

}

正如您在此處看到的那樣,它也同樣有效。


查看完整回答
反對 回復 2022-07-04
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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