首頁 > 後端開發 > Golang > 為什麼在值接收器方法中修改 Go Struct 欄位不會改變原始值?

為什麼在值接收器方法中修改 Go Struct 欄位不會改變原始值?

DDD
發布: 2024-12-15 17:16:18
原創
117 人瀏覽過

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

為結構體欄位分配新值

在Go 中,處理結構時,理解值接收者與值接收者的概念非常重要指針接收器。值接收器對原始值的副本進行操作,而指標接收器則直接對原始值進行操作。

考慮以下程式碼片段,其中提出了有關意外未更改的結構字段值的問題:

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 結構的x 字段,這應該反映在Print() 方法中。但是,輸出顯示 x 欄位保持不變。

解決方案:使用指標接收器

問題在於 Move( 中使用值接收器) ) 和 Print() 方法。在 Go 中,一切都是按值傳遞的,這意味著在將結構體傳遞給函數時會建立原始值的副本。因此,函數內對副本所做的任何修改都不會影響原始值。

為了解決這個問題,我們需要使用指標接收器。指標接收器允許函數直接對原始值進行操作。這是修正後的程式碼:

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() 和Print() 方法的指標接收器,我們現在直接對原始Point 結構進行操作,並且對x 欄位的變更可以正確反映.

以上是為什麼在值接收器方法中修改 Go Struct 欄位不會改變原始值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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