go:struct 中的数组丢失其内容

下面的代码(共享:链接)应该在一个订单中插入两个位置(订单和位置都是struct s:


package main


import "fmt"


type orderPosition struct{

   art string

   qty string   

}


type order struct{

   posList []orderPosition

}


func main() {

  o := new(order)

  o.loadPos()

  fmt.Printf("# pos: %d\n",len(o.posList))


}


func (o order) loadPos() {

  o.posList = append(o.posList, orderPosition {art: "art 1", qty: "2 pc"})

  o.posList = append(o.posList, orderPosition {art: "art 2", qty: "7 pc"})

  fmt.Printf("# pos: %d\n",len(o.posList))

}

输出是:


# pos: 2

# pos: 0    

loadPos方法按顺序填充仓位。但是一旦离开该方法,位置列表就会丢失。


为什么数组会丢失其内容?


任何帮助将不胜感激。


慕标琳琳
浏览 217回答 2
2回答

慕仙森

扩展帕特里克的回答,在Golang FAQ 中有更多的见解我应该定义值还是指针的方法?func (s *MyStruct) pointerMethod() { } // method on pointer func (s MyStruct)  valueMethod()   { } // method on value首先,也是最重要的,该方法是否需要修改接收器?如果是,则接收者必须是一个指针。(切片和映射充当引用,所以它们的故事有点微妙,但是例如要更改方法中切片的长度,接收者仍然必须是指针。)在上面的示例中,如果 pointerMethod 修改了s,调用者将看到这些更改,但 valueMethod 是使用调用者参数的副本(这是传递值的定义)调用的,因此调用者将看不到它所做的更改。二是对效率的考虑。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。接下来是一致性。如果该类型的某些方法必须有指针接收器,其余的也应该如此,因此无论如何使用该类型,方法集都是一致的。对于诸如基本类型、切片和小型结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go