首頁 > 後端開發 > Golang > 為什麼在 Go 結構方法中附加到切片並不總是有效?

為什麼在 Go 結構方法中附加到切片並不總是有效?

DDD
發布: 2025-01-03 10:15:39
原創
510 人瀏覽過

Why Doesn't Appending to a Slice in a Go Struct Method Always Work?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板