首頁 >後端開發 >Golang >Go 中的指標接收器如何影響函數內的結構修改?

Go 中的指標接收器如何影響函數內的結構修改?

Barbara Streisand
Barbara Streisand原創
2024-12-23 13:10:21472瀏覽

How Do Pointer Receivers in Go Impact Struct Modification Within Functions?

修改結構體欄位值

在 Go 中,當函數接收結構體時,它通常會接收原始物件的副本。因此,對此函數中的結構進行的任何修改都不會影響原始物件。

考慮以下範例,其中我們定義了一個具有兩個欄位 x 和 dx 的結構 Point。 Move 方法將 x 增加 dx,Print 方法列印 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 和 Print 方法會作為值接收器附加到 Point 結構。這表示當 st 傳遞給這些方法時,將建立原始 st 物件的副本。在這些方法中對副本所做的任何修改都不會影響原始 st 物件。

因此,當我們呼叫 st.Move() 時,st 的副本會被修改,但原始 st 物件保持不變。因此,當我們在 st.Print() 中列印 st 時,我們仍然看到 x 的原始值。

要解決這個問題,我們必須修改 Move 和 Print 方法以使用指標接收器而不是值接收器。這確保了對這些方法中的結構所做的任何修改都會影響原始物件。

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()
}

透過使用指標接收器,我們現在得到預期的輸出:

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=5

以上是Go 中的指標接收器如何影響函數內的結構修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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