修改結構體欄位值
在 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中文網其他相關文章!