首頁 > 後端開發 > Golang > 如何正確修改Go中的結構體欄位?

如何正確修改Go中的結構體欄位?

Mary-Kate Olsen
發布: 2024-12-17 17:58:10
原創
220 人瀏覽過

How to Correctly Modify Struct Fields in Go?

Go 中為結構體字段賦值

在Go 中,結構體通常用來封裝相關的數據,並提供一組方法來操縱他們的領域。然而,使用結構體欄位時遇到的常見問題是正確修改其值。

在下面的範例中,使用兩個欄位 x 和 dx 建立了一個名為 Point 的結構體。定義了兩個方法 Move() 和 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)
}
登入後複製

在 main() 中,建立一個新的 Point 實例,預設值 x=3 和dx=2。呼叫 Move() 和 Print() 方法,期望 x 欄位的值在 Move() 期間發生更改,並且 Print() 輸出將反映更新後的值(最終 x=5)。然而,實際輸出如下:

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=3
登入後複製

出現這種意外行為是因為這兩種方法的接收器都被定義為值接收器(即 Point)而不是指標接收器(*Point)。在 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)
}
登入後複製

透過此修改,Move() 方法可以正確更新 x 字段,並且Print() 方法輸出更新後的值。

以上是如何正確修改Go中的結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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