gpt4 book ai didi

go - 指向值略有不同的结构的指针 slice 重复

转载 作者:行者123 更新时间:2023-12-01 22:33:25 24 4
gpt4 key购买 nike

给定两种嵌套类型

type Inner struct {
InnerVal int
}

type Outer struct {
InnerStruct *Inner
OuterVal int
}
我需要复制指向 Outer的指针的一部分
originalSlice := []*Outer{<plenty_of_items>}
本身为 ,但在重复项(包括Outer.InnerStruct.InnerVal)中更新了字段值
为此,我创建了一个与 originalSlice具有相同类型和长度的新 slice ,将指针添加到具有更改后的值的新创建结构,最后将这些项添加到 originalSlice
duplicateSlice := 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...)
虽然这很冗长,无法跟随指针,但是我认为,当作为 nowDoubledSlice传递到函数之后并通过循环访问时,
someOtherSlice := make([]*types.Inner, len(nowDoubledSlice))

for i, doubledItem := range nowDoubledSlice {
someOtherSlice[i] = doubledItem.InnerStruct
}
我得到一个

运行时错误:无效的内存地址或nil指针取消引用

这是为什么?还有一种更优雅或更惯用的方法来复制指向结构的指针,同时更改重复项的字段吗?

最佳答案

与指针创建无关,这是您的 slice 分配。这行:

duplicateSlice := make([]*Outer, len(originalSlice))
创建一个新的长度为 len(originalSlice)的 slice ,并填充零值元素。您可能想要的是:
duplicateSlice := make([]*Outer, 0, len(originalSlice))
创建一片长度为 0但容量为 len(originalSlice)的 slice 。 as you can see here可以正常工作。
另外,您可以保留 make([]*Outer, len(originalSlice))并在循环中使用索引而不是 append:
for i, originalItem := range originalSlice {
duplicateSlice[i] =&Outer{
InnerStruct: &Inner{
InnerVal: originalItem.InnerStruct.InnerVal + 1,
},
OuterVal: originalItem.OuterVal + 1,
}
}
as you can see here也一样。

关于go - 指向值略有不同的结构的指针 slice 重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64054430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com