为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标琳琳 2021-09-27 14:18:42
下面的代码(共享:链接)应该在一个订单中插入两个位置(订单和位置都是struct s:package mainimport "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方法按顺序填充仓位。但是一旦离开该方法,位置列表就会丢失。为什么数组会丢失其内容?任何帮助将不胜感激。
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

扩展帕特里克的回答,在Golang FAQ 中有更多的见解

我应该定义值还是指针的方法?

func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct)  valueMethod()   { } // method on value

首先,也是最重要的,该方法是否需要修改接收器?如果是,则接收者必须是一个指针。(切片和映射充当引用,所以它们的故事有点微妙,但是例如要更改方法中切片的长度,接收者仍然必须是指针。)在上面的示例中,如果 pointerMethod 修改了s,调用者将看到这些更改,但 valueMethod 是使用调用者参数的副本(这是传递值的定义)调用的,因此调用者将看不到它所做的更改。

二是对效率的考虑。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。

接下来是一致性。如果该类型的某些方法必须有指针接收器,其余的也应该如此,因此无论如何使用该类型,方法集都是一致的。

对于诸如基本类型、切片和小型结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信