为了账号安全,请及时绑定邮箱和手机立即绑定

指向具有略微不同值的结构的指针的重复切片

指向具有略微不同值的结构的指针的重复切片

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 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信