gpt4 book ai didi

go - 在 Golang 中向嵌套的 map[string]interface{} 添加属性

转载 作者:行者123 更新时间:2023-12-01 22:39:54 26 4
gpt4 key购买 nike

我正在处理 map[string]interface{} 类型的数据.它可以在 (map[string]interface{}) 类型中包含无限数量的嵌套对象。

编辑:此数据来自 mongodb。我不能在这里真正应用 golang 的结构,因为属性因文档而异。我要做的就是获取嵌套最深的对象,为其添加一个新属性并确保之后更新整个数据对象。

data["person"] = map[string]interface{}{
"peter": map[string]interface{}{
"scores": map[string]interface{}{
"calculus": 88,
"algebra": 99,
"golang": 89,
},
},
}

这些数据来自远程 API,我不知道里面的属性。我要添加的只是在最后一个对象中添加新属性(在本例中为“scores”),让我们说使用这个新属性(“physics”)数据看起来像这样
data["person"] = map[string]interface{}{
"peter": map[string]interface{}{
"scores": map[string]interface{}{
"calculus": 88,
"algebra": 99,
"golang": 89,
"physics": 95,
},
},
}

我不确定如何将该属性添加到最后一个对象。

我进行了递归类型检查,并且能够获取每个字段并打印其值。但是因为 map 不是引用的,所以当我到达带有非复杂类型值的 map 时,我无法向原始 map 添加值。
package main

import "fmt"

func main() {

data := make(map[string]interface{})
data["person"] = map[string]interface{}{
"peter": map[string]interface{}{
"scores": map[string]interface{}{
"calculus": 88,
"algebra": 99,
"golang": 89,
},
},
}

parseMap(data)
}


func parseMap(aMap map[string]interface{}) interface{} {
var retVal interface{}

for _, val := range aMap {
switch val.(type) {
case map[string]interface{}:
retVal = parseMap(val.(map[string]interface{}))
//case []interface{}:
// retVal = parseArray(val.([]interface{}))
default:
//here i would have done aMap["physics"] = 95 if I could access the original map by reference, but that is not possible

retVal = aMap

}
}

return retVal
}

最佳答案

根据对该问题的评论,目标是在嵌套最深的 map 中设置一个值。

使用以下函数查找最大嵌套级别的 map 。如果在最大嵌套级别有多个映射,则此函数返回这些映射中的任意一个。

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

Run it on the playground .

关于go - 在 Golang 中向嵌套的 map[string]interface{} 添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58474309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com