2 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
根據(jù)對(duì)該問(wèn)題的評(píng)論,目標(biāo)是在最深層嵌套的映射中設(shè)置一個(gè)值。
使用以下函數(shù)查找最大嵌套級(jí)別的映射。如果最大嵌套級(jí)別有多個(gè)映射,則此函數(shù)返回這些映射中的任意一個(gè)。
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
}
像這樣使用它在深度嵌套映射中設(shè)置一個(gè)值:
_, m := findDeepest(data)
m["physics"] = 95

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