Я имею дело с данными типа map[string]interface{}
. он может иметь неограниченное количество вложенных объектов внутри (map [string] interface {}) типов.
РЕДАКТИРОВАТЬ: Эти данные получены от mongodb. Я действительно не могу применить структуру Голанга здесь, потому что атрибуты варьируются от документа к документу. Все, что я хочу сделать, это получить наиболее глубоко вложенный объект, добавить в него новый атрибут и убедиться, что весь объект данных обновляется после.
data["person"] = map[string]interface{}{
"peter": map[string]interface{}{
"scores": map[string]interface{}{
"calculus": 88,
"algebra": 99,
"golang": 89,
},
},
}
Эти данные поступают из удаленного APIи я понятия не имею о свойствах внутри. Все, что я хочу добавить, это добавить новый атрибут внутри последнего объекта (в данном случае «баллы»), и, скажем, с этим новым атрибутом («физика») данные будут выглядеть так:
data["person"] = map[string]interface{}{
"peter": map[string]interface{}{
"scores": map[string]interface{}{
"calculus": 88,
"algebra": 99,
"golang": 89,
"physics": 95,
},
},
}
IЯ не уверен, как я мог добавить этот атрибут к самому последнему объекту.
Я сделал рекурсивную проверку типов и смог получить каждое поле и вывести его значение. Но поскольку карты не являются ссылочными, я не могу добавить значение к исходной карте, когда достигну карты со значениями, которые не являются сложными типами.
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
}