給定兩個嵌套類型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,
}
}
正如您在此處看到的那樣,它也同樣有效。
- 1 回答
- 0 關注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消