我有两片,
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)
}
这看起来非常简单,但相信我,我找不到一个解决方案。 我们怎么能这样做?
答案 0 :(得分:8)
这就是内置append()
函数的用途:将值(可能是切片的值)附加到另一个的末尾。结果是连接。
如果您希望s1
成为"独立的" s2
和s1
,然后将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
:)