下面的代码(共享:链接)应该在一个订单中插入两个位置(订单和位置都是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 是使用调用者参数的副本(这是传递值的定义)调用的,因此调用者将看不到它所做的更改。
二是对效率的考虑。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。
接下来是一致性。如果该类型的某些方法必须有指针接收器,其余的也应该如此,因此无论如何使用该类型,方法集都是一致的。
对于诸如基本类型、切片和小型结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的。
- 2 回答
- 0 关注
- 216 浏览
添加回答
举报
0/150
提交
取消