首页 文章

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

提问于
浏览
9

我正在使用Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些都会让我看到一个 []map[string]interface{} 我'm thinking of Append but its just not clear enough if this is even possible. What is the final datatype I'?

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

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

2 回答

  • 9

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

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

    输出将是:

    [map[one:1 two:2] map[three:3 four:4]]
    

    Playground example

  • 7

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

    // 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))
    }
    

相关问题