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