首頁 >後端開發 >Golang >為什麼我的Go Struct方法沒有修改原始物件?

為什麼我的Go Struct方法沒有修改原始物件?

DDD
DDD原創
2024-12-18 15:04:11849瀏覽

Why Does My Go Struct Method Not Modify the Original Object?

為結構體欄位分配新值

考慮以下場景: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn