切片内容在函数调用后被擦除

时间:2018-12-29 18:45:18

标签: pointers go append slice

这是我要了解和更改的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

2 个答案:

答案 0 :(得分:1)

该方法必须位于结构的指针上,如下所示:

func (self *mystruct) Foo () {}

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

答案 1 :(得分:1)

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

func (self *mystruct) populateslice() {

有关一般最佳的更广泛的讨论,请参见此处:

Value receiver vs. Pointer receiver in Golang?