無法追加到方法外部的結構體切片
在Go 中使用切片時,追加到以下切片時會出現一個常見問題:結構體的屬性。在某些情況下,儘管直接在結構體上執行正確,此操作可能會失敗。
考慮以下範例:
type Test1 struct { all []int } func (c Test1) run() []int { for i := 0; i < 2; i++ { c.all = append(c.all, i) } return c.all }
這裡,程式碼成功附加到結構體中的所有切片Test1 結構的 run 方法。但是,如果此方法呼叫另一個方法,則追加操作會失敗。
例如:
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) } }
在這種情況下,Test3.combo 方法嘗試追加到所有切片,但失敗。原因是 Go 按值傳遞值,這表示在呼叫 c.combo() 時會建立 Test3 結構體的副本。
副本在自己的切片上運行,當方法返回時,相關的變更將被丟棄。因此,當 Test3.run 嘗試傳回 c.all 時,它會傳回一個空切片,因為副本的修改版本遺失了。
此問題的解決方案是為組合方法使用指針接收器:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
使用指針接收器可確保該方法在原始Test3 結構上運行,從而允許在組合方法返回時保留在組合方法中所做的變更。
以上是為什麼在 Go 中從另一個方法呼叫時附加到結構體切片不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!