2 回答

TA貢獻1821條經驗 獲得超5個贊
根據對該問題的評論,目標是在最深層嵌套的映射中設置一個值。
使用以下函數查找最大嵌套級別的映射。如果最大嵌套級別有多個映射,則此函數返回這些映射中的任意一個。
func findDeepest(m map[string]interface{}) (int, map[string]interface{}) {
depth := 0
candidate := m
for _, v := range m {
if v, ok := v.(map[string]interface{}); ok {
d, c := findDeepest(v)
if d+1 > depth {
depth = d + 1
candidate = c
}
}
}
return depth, candidate
}
像這樣使用它在深度嵌套映射中設置一個值:
_, m := findDeepest(data)
m["physics"] = 95

TA貢獻1797條經驗 獲得超4個贊
map[string]interface{}盡量避免使用原始類型。Goencoding/json文件可以很好地處理字符串鍵控的映射,并且希望遠程 API對于您正在處理的內容有某種規范。(例如,您知道您需要一個person頂級密鑰并且位于層次結構中的特定點。)scores
我假設遠程 API 是 JSON-over-HTTP。您可以將其結構建模為
type Input struct {
Person map[string]Person `json:"person"`
}
type Person struct {
Scores map[string]int `json:"scores"`
}
將json.Unmarshal()數據寫入此結構后,您可以直接設置
data.Person["peter"].Scores["physics"] = 95
然后json.Marshal()再次得到結果。 https://play.golang.org/p/qoAVFodSvK2有一個完整的示例。
如果您確實想直接操作map[string]interface{}結構,我建議將每個“級別”拆分為單獨的函數調用
func ParseTopLevel(data map[string]interface{}) {
switch peter := data["peter"].(type) {
case map[string]interface{}:
ParsePeter(peter)
}
}
map類型是通過引用傳遞的,因此當到達堆棧底部時可以直接設置scores["physics"] = 95。(在您的原始代碼中,如果您無法按照aMap["physics"]您的建議直接設置,我會感到驚訝,盡管設置的內容相當不精確;比較https://play.golang.org/p/VuTjcjezwwU。)
- 2 回答
- 0 關注
- 563 瀏覽
添加回答
舉報