首頁 >後端開發 >Golang >為什麼在 Go 中從另一個方法呼叫時附加到結構體切片不起作用?

為什麼在 Go 中從另一個方法呼叫時附加到結構體切片不起作用?

Linda Hamilton
Linda Hamilton原創
2024-12-19 13:08:14219瀏覽

Why Doesn't Appending to a Struct Slice Work in Go When Called From Another Method?

無法追加到方法外部的結構體切片

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn