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