将结构切片附加到另一个

我是 Golang 的新手,正在尝试将一片结构的内容附加到另一个实例中。数据被追加,但在方法之外是不可见的。下面是代码。


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)

}

然后在主包中初始化结构并调用 AddAllStructs 方法。


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)

}

上面的程序输出如下:


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}]}

我试图了解我在这里遗漏了什么,因为数据在方法中是可见的。感谢对此的任何帮助。


白猪掌柜的
浏览 81回答 3
3回答

手掌心

使用指针接收器: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)}如果方法需要改变接收者,接收者必须是一个指针

拉丁的传说

您必须返回以下结果append:package mainimport (    "fmt")func main() {    // Wrong    var x []int    _ = append(x, 1)    _ = append(x, 2)    fmt.Println(x) // Prints []    // Write    var y []int    y = append(y, 1)    y = append(y, 2)    fmt.Println(y) // Prints [1 2]}

红颜莎娜

您可以通过使用指针接收器而不是值接收器轻松解决此问题。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)} 记住在 go 中,如果你看到一个切片内部结构,它是一个包含指向数据结构指针的结构。所以主要的切片不知道新附加切片的容量并且已经打印了相同的切片。其次,您不必返回附加切片的结果。这里指针接收者来救援,因为值接收者不能改变原始值。在 go playground 运行代码: https ://play.golang.org/p/_vxx7Tp4dfN
打开App,查看更多内容
随时随地看视频慕课网APP