dongshendie8849 2018-11-09 04:15
浏览 159
已采纳

将切片结构追加到另一个

I am new to Golang and am trying to append the contents of a slice of struct into another instance. The data gets appended but it is not visible outside the method. Below is the code.

package somepkg

import (
    "fmt"
)

type SomeStruct struct {
    Name  string
    Value float64
}

type SomeStructs struct {
    StructInsts []SomeStruct
}

func (ss SomeStructs) AddAllStructs(otherstructs SomeStructs) {

    if ss.StructInsts == nil {
        ss.StructInsts = make([]SomeStruct, 0)
    }

    for _, structInst := range otherstructs.StructInsts {
        ss.StructInsts = append(ss.StructInsts, structInst)
    }

    fmt.Println("After append in method::: ", ss.StructInsts)
}

Then in the main package I initialize the structs and invoke the AddAllStructs method.

package main

import (
  "hello_world/somepkg"
  "fmt"
)

func main() {
    var someStructs = somepkg.SomeStructs{
      []somepkg.SomeStruct{
        {Name: "a", Value: 1.0},
        {Name: "b", Value: 2.0},
      },
    }

    var otherStructs = somepkg.SomeStructs{
      []somepkg.SomeStruct{
        {Name: "c", Value: 3.0},
        {Name: "d", Value: 4.0},
      },
    }

    fmt.Println("original::: ", someStructs)
    fmt.Println("another::: ", otherStructs)

    someStructs.AddAllStructs(otherStructs)

    fmt.Println("After append in main::: ", someStructs)
}

The above program output is below:

original:::  {[{a 1} {b 2}]}
another:::  {[{c 3} {d 4}]}
After append in method:::  [{a 1} {b 2} {c 3} {d 4}]
After append in main:::  {[{a 1} {b 2}]}

I am trying to understand what I am missing here since the data is visible in the method. Appreciate any help on this.

-- Anoop

  • 写回答

3条回答 默认 最新

  • dongpanbo4727 2018-11-09 04:24
    关注

    Use pointer receiver:

    func (ss *SomeStructs) AddAllStructs(otherstructs SomeStructs) {
    
        if ss.StructInsts == nil {
            ss.StructInsts = make([]SomeStruct, 0)
        }
    
        for _, structInst := range otherstructs.StructInsts {
            ss.StructInsts = append(ss.StructInsts, structInst)
        }
    
        fmt.Println("After append in method::: ", ss.StructInsts)
    }
    

    If the method needs to mutate the receiver, the receiver must be a pointer

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改