Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Golang中将两个或多个[]映射[string]接口{}类型合并为一个_Arrays_Go_Types_Maps - Fatal编程技术网

Arrays 在Golang中将两个或多个[]映射[string]接口{}类型合并为一个

Arrays 在Golang中将两个或多个[]映射[string]接口{}类型合并为一个,arrays,go,types,maps,Arrays,Go,Types,Maps,我正在使用Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些查询都会返回一个[]映射[string]接口{} 我正在考虑追加,但它只是不够清楚,如果这是可能的。 我看到的最终数据类型是什么 显然,以键作为字符串的接口映射数组应该能够简单地“附加”(concat,如果可以的话)到另一个以键作为字符串的接口映射数组 那么,实现这一点的机制是什么呢?即使答案已经在上面的评论中给出了,我也将发布一个简短的示例,说明如何实现这一点 package main import (

我正在使用Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些查询都会返回一个
[]映射[string]接口{}
我正在考虑追加,但它只是不够清楚,如果这是可能的。 我看到的最终数据类型是什么

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


那么,实现这一点的机制是什么呢?

即使答案已经在上面的评论中给出了,我也将发布一个简短的示例,说明如何实现这一点

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]]

另一个答案是正确的。您还可以编写一个helper函数来避免重复的贴图合并

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

上述由和建议的解决方案都有效,但是当您想要合并Go结构和映射时,使用它会更加简单、方便和优化,这涵盖了除合并map[string]interface{}之外的大量场景

package main

import (
    "fmt"
    "github.com/imdario/mergo"
)

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

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

    mergo.Merge(&mp1, mp2) //mergo.Merge(&dest,src)
   
    fmt.Println(mp1)
}
输出:

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


另外,在Golang没有秩序保护。实际上,在Go中迭代贴图总是以随机顺序进行的。所以不要依赖于映射的键顺序。

好吧,你可以迭代:
对于k,v:=range(map1){map2[k]=v}
但是你需要决定当发生键冲突时会发生什么。您可以使用
v检查,确定:=map2[k];如果!好的{…}
对不起,我错过了这一部分。您可以执行
newslice:=append(slice1,slice2…
请参阅。确保您可以只追加结果:=append(result1,result2…),如果结果是相同类型的[]映射[string]接口{},您是对的。我只是用@Uvelichitel所说的来尝试一下,并且不得不做了两次(因为我有3个数组),它就像一个符咒一样工作!我应该把它作为一个答案吗?事实上,这个问题应该重新编写,以匹配go的语法和能力。对于问题和围棋来说,切片中包含地图是无关紧要的。您可以对任何切片类型执行相同的操作,例如
[]byte
。这就是go的内部函数
append
的用途,也是它的文档化方式(为切片追加和复制)。太好了!在我的例子中,我有map1、map2和map3所有[]map[string]接口{}类型,我有-result:=map1 result=append(result,map2…)result=append(result,map3…),这正是我需要的!从长远来看,这是有意义和有用的!非常感谢。请注意,这是一种完全不同的操作类型<代码>追加对切片进行操作。如果合并两个映射,则可以定义两个不同的合并操作(
A:=A merge B
),其中B[k]覆盖A[k],另一个则A[k]在B[k]上保留其值。这就是为什么此答案以“另一个答案正确”开头的原因。虽然除了处理json(或一些外部数据流)之外,有一个“地图片”是一个常见的错误,
mp3
实际上没有在第一个答案中的任何地方使用。就个人而言,我更喜欢您的解决方案,因为在我的用例中,我实际上希望后续的地图(用于存储来自多个源的各种配置变量)以覆盖存储在第一个映射上的“默认”配置。对于这种用法,这是完美的!谢谢