【问题标题】:Slice content erased after function call [duplicate]函数调用后删除切片内容[重复]
【发布时间】:2026-01-13 04:30:01
【问题描述】:

这是我试图理解和改变的 golang 行为:我编写了一个方法来用 Golang 中的切片填充结构。它在方法本身内工作,但切片内容在方法之外丢失。但是我想保留内容。这可能来自切片内的指针在 populateslice 方法末尾被删除的事实,但我应该如何编写它以防止这种情况发生,即。在函数调用后保留 mystruct.myslice 中的内容?

这是我编写代码的方式:

type BBDatacolumn struct {
  Data []string
}

type Mystruct struc {
   myslice []BBDatacolumn
}

//Method to populate the slice of the structure mystruct:
func (self mystruct) populateslice() {
   for i:=0; i<imax; i++ {
     bufferdatacolumn := NewBBDatacolumn()
     //Here, code to populate bufferdatacolumns

     self.myslice = append(self.myslice, bufferdatacolumn)
  }

  self.myslice.display() //Here, works fine: myslice contains the data of the BBDatacolumn correctly
}

//Later in the code (outside of the populateslice func):
mystructinstance.populateslice() //Populates slice OK at the end of the function
mystructinstance.display() //Problem: mystructinstance.myslice is empty: Instanciation of Mystruct does not contain the data in myslice anymore as it did inside the populateslice method

【问题讨论】:

    标签: pointers go append slice


    【解决方案1】:

    该方法需要“打开”结构的指针,如下所示:

    func (self *mystruct) Foo () {}
    

    否则,您调用方法的 mystruct 对象仅对函数是本地的。

    【讨论】:

    • 我进行了更改,并且确实有效。非常感谢。
    【解决方案2】:

    方法的接收者(func 和方法名称之间的部分)可以是你所拥有的值接收者,也可以是指针接收者。当您有一个值接收器时,该对象的副本将传递给该方法,因此所做的任何修改都保留在该副本中。如果你想修改对象,那么你必须有一个指针接收器:

    func (self *mystruct) populateslice() {
    

    要更广泛地讨论总体上哪个是最好的,请参见此处:

    Value receiver vs. Pointer receiver in Golang?

    【讨论】: