為結構體欄位分配新值
考慮以下場景:Point 類別使用Move() 方法定義,該方法調整x座標和Print() 方法來顯示結果。然而,程式碼表現出意外的行為,在呼叫 Move() 後顯示初始 x 值而不是調整後的 x 值。
type Point struct { x, dx int } func (s Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
問題源自於 Move() 被定義為值接收器這一事實,這意味著它對原始 Point 物件的副本進行操作。因此,在 Move() 中對 s 的修改對實際實例沒有影響。
要解決此問題,應將Move() 方法定義為指標接收器,允許其直接與原始物件互動:
type Point struct { x, dx int } func (s *Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s *Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
現在,當呼叫Move() 時,s變數指向原始Point 對象,因此對s.x 的變更會直接影響實例。因此,在 Move() 之後呼叫 Print() 可以正確顯示更新的 x 座標。
以上是為什麼我的Go Struct方法沒有修改原始物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!