在golang中连接2个切片

时间:2017-09-19 16:47:59

标签: go slice

我有两片,

s1 := []int{1, 2, 3, 4, 5}
s2 := []int{3, 4, 5, 6, 7}

我想要结果

s3 = []int{1, 2, 3, 4, 5, 3, 4, 5, 6, 7}

我正在做类似的事情:

for _, x := range s1 {
        s2 = append(s2, x)
    }

这看起来非常简单,但相信我,我找不到一个解决方案。 我们怎么能这样做?

2 个答案:

答案 0 :(得分:8)

这就是内置append()函数的用途:将值(可能是切片的值)附加到另一个的末尾。结果是连接。

如果您希望s1成为"独立的" s2s1,然后将nil追加到空的s2切片,然后将s3 := append(append([]int{}, s1...), s2...) fmt.Println(s3) 追加到结果中:

s3

如果s1可以使用/重叠s2,您只需将s1追加到s4 := append(s1, s2...) fmt.Println(s4)

[1 2 3 4 5 3 4 5 6 7]

两种情况下的输出(在Go Playground上尝试):

s1

注意:这"重叠"意味着如果您将值附加到s1,如果它具有足够的容量,则不会分配新的切片,arr := [...]int{1, 2, 3, 4, 5, 6, 7, 0, 0, 0} s1 := arr[:5] s2 := arr[2:7] fmt.Println("s1:", s1, "cap:", cap(s1)) fmt.Println("s2:", s2) s3 := append(s1, s2...) fmt.Println("s3:", s3) fmt.Println("s2:", s2) 将被重新设置为具有足够的长度来容纳您想要附加到它的元素。如果不明智地使用,这可能会产生令人惊讶的副作用,如本例所示:

s1: [1 2 3 4 5] cap: 10
s2: [3 4 5 6 7]
s3: [1 2 3 4 5 3 4 5 6 7]
s2: [3 4 5 3 4]

输出是(在Go Playground上尝试):

s2

这里可能令人惊讶的是,当我们将s1附加到s3并将结果存储在s2(这是我们所期望的)时,{{1}的内容(元素)也改变了。这样做的原因是append()看到s1有足够的能力向s2追加s2,因此它没有创建新的数组,它刚刚复制s1并添加了元素"就地"。但是编写附加元素的区域与s2元素所在的内存完全相同,因此s2的元素也被覆盖。

答案 1 :(得分:4)

我建议您查看此页面:https://github.com/golang/go/wiki/SliceTricks

这是golang的官方文档。对于您的问题,您只需使用append:)