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

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

在 golang 中的地圖上執(zhí)行 upsert

在 golang 中的地圖上執(zhí)行 upsert

Go
FFIVE 2022-12-19 10:38:21
所以我有 2 個(gè)配置,一個(gè)你可以說(shuō)它有點(diǎn)像默認(rèn)配置,另一個(gè)基于請(qǐng)求需要更新或插入屬性。兩者的例子:{    "config": {        "type": "func1",        "config": {            "param1": "10",            "param2": "10"        },        "connected": [            {                "type": "func2",                "config": {                    "param1": "20",                    "param2": "20"                },            }        ]    }}{    "config": {        "type": "func1",        "config": {},        "connected": [            {                "type": "func2",                "config": {                    "param1": "30",                },              }        ]    }}我能夠遍歷一個(gè)地圖,但想知道如何傳遞兩個(gè)配置/地圖并檢查屬性是否存在。任何幫助,將不勝感激。func checkkeyPairExists(value interface{}) {    switch value.(type) {    case []interface{}:        for _, v := range value.([]interface{}) {            checkkeyPairExists(v)        }    case map[string]interface{}:        for k, v := range value.(map[string]interface{}) {            fmt.Println(k, v)            checkkeyPairExists(v)        }    }}所需的輸出:{    "config": {        "type": "func1",        "config": {            "param1": "10",            "param2": "10"        },        "connected": [            {                "type": "func2",                "config": {                    "param1": "20",                    "param2": "30"                },            }        ]    }}
查看完整描述

3 回答

?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

在不了解有關(guān)您的數(shù)據(jù)/模式的安全假設(shè)的更多詳細(xì)信息的情況下,很難推薦完整的解決方案,但我可以嘗試一下您在此處擁有的內(nèi)容。


將您的概念從接口稍微限制為代表您的節(jié)點(diǎn)的結(jié)構(gòu)可能會(huì)使這里的事情變得更容易一些。


type ConfigNode struct {

    Type       string

    Properties map[string]string

    Connected  []*ConfigNode

}


func (n *ConfigNode) PatchProperties(patch *ConfigNode) {

    for k, v := range patch.Properties {

        n.Properties[k] = v

    }

}


func (n ConfigNode) ShallowClone() ConfigNode {

    clone := ConfigNode{

        Type:       n.Type,

        Properties: make(map[string]string),

        Connected:  make([]*ConfigNode, 0),

    }

    clone.PatchProperties(&n)


    return clone

}


func (n *ConfigNode) PrintTree() string {

    builder := strings.Builder{}

    n.appendToTreePrint(&builder, 0)


    return builder.String()

}


func (n *ConfigNode) appendToTreePrint(builder *strings.Builder, depth int) {

    isRoot := builder == nil

    tab := strings.Repeat("\t", depth)

    if isRoot {

        builder = &strings.Builder{}

    }


    builder.WriteString(tab)

    builder.WriteString(n.Type)

    builder.WriteRune('\n')


    for k, v := range n.Properties {

        builder.WriteString(fmt.Sprintf("%s - %s => %s\n", tab, k, v))

    }


    for _, c := range n.Connected {

        c.appendToTreePrint(builder, depth+1)

    }

}


func mergeNodes(base []*ConfigNode, patch []*ConfigNode) []*ConfigNode {

    merged := make([]*ConfigNode, 0)


    if patch == nil {

        // No patch is being applied, just deep copy the base nodes.

        for _, node := range base {

            clone := node.ShallowClone()

            clone.Connected = mergeNodes(clone.Connected, nil)

            merged = append(merged, &clone)

        }


        return merged

    }


    baseTypes := make(map[string]*ConfigNode)

    patchTypes := make(map[string]*ConfigNode)


    // Key the nodes by their Type so we can match them.

    for _, node := range base {

        baseTypes[node.Type] = node

    }

    for _, node := range patch {

        patchTypes[node.Type] = node

    }


    for k, v := range baseTypes {

        mergedNode := v.ShallowClone()


        if patchNode, ok := patchTypes[k]; ok {

            // A patch node was found with the Type matching the base, combine the two.

            mergedNode.PatchProperties(patchNode)

            // Remove the patch node so we don't iterate through it later.

            delete(patchTypes, k)


            // Recurse in and merge child nodes.

            mergedNode.Connected = mergeNodes(v.Connected, patchNode.Connected)

        } else {

            // There is no patch so we can just deep copy the children.

            mergedNode.Connected = mergeNodes(v.Connected, nil)

        }


        merged = append(merged, &mergedNode)

    }


    // Any unmatched patch nodes can be deep copied into the output.

    for _, v := range patchTypes {

        mergedNode := v.ShallowClone()

        mergedNode.Connected = mergeNodes(v.Connected, nil)

        merged = append(merged, &mergedNode)

    }


    return merged

}


func printConfig(name string, config []*ConfigNode) {

    fmt.Println(name + ":")

    for _, v := range config {

        fmt.Println(v.PrintTree())

    }

}


func initTestNodes() (base []*ConfigNode, patch []*ConfigNode) {

    var node1Base ConfigNode

    var node2Base ConfigNode

    var node3Base ConfigNode


    var node1Patch ConfigNode

    var node3Patch ConfigNode

    var node4Patch ConfigNode


    node1Base = ConfigNode{

        Type: "func1",

        Properties: map[string]string{

            "params1": "orig1",

            "params2": "orig1",

        },

        Connected: []*ConfigNode{&node2Base},

    }

    node2Base = ConfigNode{

        Type: "func2",

        Properties: map[string]string{

            "params1": "orig2",

            "params2": "orig2",

        },

        Connected: []*ConfigNode{&node3Base},

    }

    node3Base = ConfigNode{

        Type: "func3",

        Properties: map[string]string{

            "params1": "orig3",

            "params2": "orig3",

        },

        Connected: []*ConfigNode{},

    }

    node1Patch = ConfigNode{

        Type: "func1",

        Properties: map[string]string{

            "params1": "up1",

        },

        Connected: []*ConfigNode{&node4Patch},

    }

    node3Patch = ConfigNode{

        Type: "func3",

        Properties: map[string]string{

            "params1": "up3",

        },

        Connected: []*ConfigNode{},

    }

    node4Patch = ConfigNode{

        Type: "func4",

        Properties: map[string]string{

            "params1": "up4",

        },

        Connected: []*ConfigNode{&node3Patch},

    }


    return []*ConfigNode{&node1Base}, []*ConfigNode{&node1Patch}

}


func main() {

    baseConfig, patchConfig := initTestNodes()

    merged := mergeNodes(baseConfig, patchConfig)


    printConfig("Base Config", baseConfig)

    printConfig("Patch Config", patchConfig)

    printConfig("Merged Config", merged)

}



查看完整回答
反對(duì) 回復(fù) 2022-12-19
?
繁華開(kāi)滿天機(jī)

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊

遞歸地下降它們并更新值,因?yàn)橹挥衟roperties地圖內(nèi)的屬性才會(huì)改變。


讓我知道我是否可以進(jìn)一步改進(jìn)此功能。


func checkkeyPairExists(value1, value2 interface{}) {

    switch value1.(type) {

    case []interface{}:

        for k, v := range value1.([]interface{}) {

            fmt.Println("SLICE ", k, v)

            v2 := value2.([]interface{})

            checkkeyPairExists(v, v2[k])

        }

    case map[string]interface{}:

        for k, v := range value1.(map[string]interface{}) {

            fmt.Println("MAP", k, v)

            v2 := value2.(map[string]interface{})

            if k != "config" && k != "type" && k != "connected" {

                fmt.Println("UPDATED", k, v)

                v2[k] = v 

                continue

            }

            checkkeyPairExists(v, v2[k])

        }


    }

}


查看完整回答
反對(duì) 回復(fù) 2022-12-19
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

你必須遞歸地下降他們兩個(gè):


func checkkeyPairExists(value1, value2 interface{}) {

    switch value1.(type) {

    case []interface{}:

        v2, ok:=value2.([]interface{})

        if !ok {

          // error, or ignore and return

        }

        // merge value1 and v2

    case map[string]interface{}:

        m2, ok:=value2.(map[string]interface{})

        if !ok {

            // error, or ignore and return

        }

        for k, v := range value1 {

            if v2, exists:=m2[k]; exists {

               // k exists in value2

            } else {

               // k is not in value2

            }

        }


    }

}


查看完整回答
反對(duì) 回復(fù) 2022-12-19
  • 3 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報(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)