登录
首页 >  Golang >  Go问答

指向结构的重复指针切片,其值略有不同

来源:stackoverflow

时间:2024-02-25 11:18:24 221浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《指向结构的重复指针切片,其值略有不同》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

给定两种嵌套类型

type inner struct {
  innerval int
}

type outer struct {
  innerstruct *inner
  outerval int
}

我需要复制指向 outer 的指针片段

originalslice := []*outer{}

与其本身,但在重复项中更新了字段值,包括 outer.innerstruct.innerval

为此,我创建了一个与 originalslice 相同类型和长度的新切片,将指针附加到新创建的具有更改值的结构体,最后将这些项附加到 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
}

我得到一个

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

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


解决方案


这与您的指针创建无关,而是您的切片分配。这一行:

duplicateslice := make([]*outer, len(originalslice))

创建一个长度为 len(originalslice) 的新切片,填充零值元素。您可能想要的是:

duplicateslice := make([]*outer, 0, len(originalslice))

创建长度为 0 的切片,但容量len(originalslice)。这工作正常,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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>