理解Go 中的切片操作
在Go 中,當切片作為結構體的屬性進行操作時,考慮值傳遞至關重要。在某些情況下,附加到方法內的切片可能會失敗。讓我們深入探究一下這背後的原因並探討解決方案。
Go 結構中的值傳遞
在 Go 中,一切都是按值傳遞,意味著建立一個副本對於每個傳遞的值。因此,在方法中對副本進行的任何修改都不會影響原始值。
測試3:失敗的追加嘗試
考慮以下程式碼:
type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } }
當你呼叫Test3.run()時,看起來c.all沒有被修改。這是因為combo()方法對Test3的副本進行操作,並且在combo()中所做的任何更改都不會傳回原始值。
解決方案:使用指標接收器
要解決此問題,請為combo() 方法使用指標接收器:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } }
透過使用指標接收者,您確保combo() 修改原始Test3 值,並且該變更會在該方法返回時反映出來。
以上是為什麼在 Go 結構方法中附加到切片並不總是有效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!