下面的代碼(共享:鏈接)應該在一個訂單中插入兩個位置(訂單和位置都是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 關注
- 245 瀏覽
添加回答
舉報
0/150
提交
取消