在Golang中将两个或多个[] map [string] interface {}类型合并为一个

Gau*_*jha 10 arrays maps types go

我正在使用Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些都返回给我一个[]map[string]interface{} 我正在考虑附加但是如果这甚至可能的话它还不够清楚.我正在看的最终数据类型是什么?

显然,一个带键作为字符串的接口映射数组应该能够简单地"附加"(如果可能的话,连接)到另一个接口映射数组,其中键作为字符串!

那么实现这一目标的机制是什么?

End*_*imo 11

即使答案已在上面的评论中给出,我将发布一个简短的例子,说明如何实现这一目标.

package main

import (
    "fmt"
)

func main() {
    result := []map[string]interface{}{}

    mp1 := map[string]interface{}{
        "one" : 1, 
        "two" : 2,
    }

    mp2 := map[string]interface{}{
        "three" : 3,
        "four" : 4,
    }

    mp3 := make(map[string]interface{})
    for k, v := range mp1 {
        if _, ok := mp1[k]; ok {
            mp3[k] = v          
        }
    }

    for k, v := range mp2 {
        if _, ok := mp2[k]; ok {
            mp3[k] = v
        }
    }

    result = append(result, mp1, mp2)
    fmt.Println(result)
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

[map[one:1 two:2] map[three:3 four:4]]
Run Code Online (Sandbox Code Playgroud)

游乐场的例子


Kav*_*ian 8

另一个答案是正确的.您还可以编写辅助函数以避免重复的映射合并.

// overwriting duplicate keys, you should handle that if there is a need
func mergeMaps(maps ...map[string]interface{}) map[string]interface{} {
    result := make(map[string]interface{})
    for _, m := range maps {
        for k, v := range m {
            result[k] = v
        }
    }
    return result
}

func main() {
    log.Println(`started`)

    v := []map[string]interface{}{
        map[string]interface{}{
            `one`: 1,
            `two`: 2,
        },
        map[string]interface{}{
            `one`:   `I`,
            `three`: 3,
            `other`: `NAN`,
        },
        map[string]interface{}{
            `name`: `Bob`,
            `age`:  300,
        },
    }

    m := mergeMaps(v...)
    log.Println(m, len(m))
}
Run Code Online (Sandbox Code Playgroud)

  • 从长远来看,它是有道理的,也是有用的!谢谢! (2认同)