分配給映射中的結構體字段
在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中文網其他相關文章!