第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
拉丁的傳說(shuō) 2023-07-31 15:31:05
我正在處理 類型的數(shù)據(jù)map[string]interface{}。它可以在 (map[string]interface{}) 類型內(nèi)擁有無(wú)限數(shù)量的嵌套對(duì)象。編輯: 此數(shù)據(jù)來(lái)自 mongodb。我不能在這里真正應(yīng)用 golang 的結(jié)構(gòu),因?yàn)閷傩砸蛭臋n而異。我想要做的就是獲取最深嵌套的對(duì)象,向其添加新屬性并確保之后更新整個(gè)數(shù)據(jù)對(duì)象。data["person"] = map[string]interface{}{    "peter": map[string]interface{}{        "scores": map[string]interface{}{            "calculus": 88,            "algebra":  99,            "golang":   89,        },    },}這些數(shù)據(jù)來(lái)自遠(yuǎn)程 API,我不知道里面的屬性。我想添加的只是在最后一個(gè)對(duì)象(在本例中為“分?jǐn)?shù)”)內(nèi)添加新屬性,并且可以說(shuō)使用這個(gè)新屬性(“物理”),數(shù)據(jù)將如下所示data["person"] = map[string]interface{}{    "peter": map[string]interface{}{        "scores": map[string]interface{}{            "calculus": 88,            "algebra":  99,            "golang":   89,            "physics":  95,        },    },}我不確定如何將該屬性添加到最后一個(gè)對(duì)象中。我進(jìn)行了遞歸類型檢查,并且能夠獲取每個(gè)字段并打印其值。但是,由于映射不是引用性的,因此當(dāng)我使用非復(fù)雜類型的值到達(dá)映射時(shí),我無(wú)法向原始映射添加值。package mainimport "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}
查看完整描述

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

在操場(chǎng)上運(yùn)行它。



查看完整回答
反對(duì) 回復(fù) 2023-07-31
?
繁星coding

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。)


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 2 回答
  • 0 關(guān)注
  • 580 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)