2 回答
TA贡献1821条经验 获得超4个赞
根据对该问题的评论,目标是在最深层嵌套的映射中设置一个值。
使用以下函数查找最大嵌套级别的映射。如果最大嵌套级别有多个映射,则此函数返回这些映射中的任意一个。
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 关注
- 428 浏览
添加回答
举报