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

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

DDD
發布: 2024-12-18 15:04:11
原創
844 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板