首頁 > 後端開發 > Golang > 如何在 Go 中修改 Map 中的結構體欄位?

如何在 Go 中修改 Map 中的結構體欄位?

Mary-Kate Olsen
發布: 2024-12-06 20:23:13
原創
380 人瀏覽過

How to Modify Struct Fields in Maps in Go?

分配給映射中的結構體字段

在Go 中使用映射時,了解分配給這些結構體字段的含義至關重要地圖。當嘗試直接修改儲存在映射中的值的結構欄位時,會出現錯誤「無法指派給映射中的結構欄位」。此錯誤是由於 Go 中映射的實作方式造成的。

在 Go 中,映射是鍵類型可比較且元素類型可以是任何類型(包括結構體)的對的集合。但是,當結構體值作為元素放入映射中時,它不會保留其可尋址性。這意味著嘗試修改其欄位(就像它是指標一樣)將觸發上述錯誤。

考慮以下程式碼:

type Snapshot struct {
  Key   string
  Users []Users
}

snapshots := make(map[string] Snapshot, 1)

// Initialization
snapshots["test"] = Snapshot {
  Key: "testVal",
  Users: make([]Users, 0),
}
登入後複製

現在,嘗試將新使用者新增至使用者在儲存在地圖中的快照值中進行切片會導致可怕的錯誤:

snapshots["test"].Users = append(snapshots["test"].Users, user)
登入後複製

要克服這個挑戰,有兩種可行的方法解決方案:

方法一:

修改之前,建立儲存在映射中的結構體值的本地副本,然後使用修改後的副本重新分配映射條目:

tmp := snapshots["test"]
tmp.Users = append(tmp.Users, user)
snapshots["test"] = tmp
登入後複製

方法2:

或者,使用指針類型定義映射,這允許修改結構體字段:

snapshots := make(map[string] *Snapshot, 1)

// Initialization
snapshots["test"] = &Snapshot {
  Key: "testVal",
  Users: make([]Users, 0),
}
登入後複製

snapshots[" test"].Users = append( snapshots["test"].Users, user)現在有效,不會遇到錯誤。但要注意的是,第二種解決方案可能會對記憶體管理產生影響,應謹慎使用。

以上是如何在 Go 中修改 Map 中的結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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