我有 2 片,
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)
}
这看起来是一个非常微不足道的问题,但请相信我,我没有找到解决这个问题的单行解决方案。 我们该怎么做?
最佳答案
这是内置的 append()
函数用于:将值(可能是 slice 的值)附加到另一个的末尾。结果是串联。
如果你想要s3
“独立于”s1
和 s2
, 然后追加 s1
为空或 nil
slice ,然后追加 s2
结果:
s3 := append(append([]int{}, s1...), s2...)
fmt.Println(s3)
如果s3
可以使用/重叠 s1
,您可以简单地附加 s2
至 s1
:
s4 := append(s1, s2...)
fmt.Println(s4)
两种情况下的输出(在 Go Playground 上尝试):
[1 2 3 4 5 3 4 5 6 7]
注意:这个“重叠”的意思是,如果您将值附加到 s1
,如果它有足够的容量,则不会分配新的 slice ,s1
将被重新 slice 以具有足够的长度以容纳您要附加到它的元素。如果使用不当,这可能会产生意想不到的副作用,如本例所示:
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)
输出是(在 Go Playground 上尝试):
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]
这里可能令人惊讶的是,当我们附加 s2
时至 s1
并将结果存储在 s3
中(这是我们所期望的),s2
的内容(元素)也变了。原因是append()
看到了s1
有足够的容量追加 s2
到它( s2
的元素),所以它没有创建一个新数组,它只是重新 slice s1
并“就地”添加了元素。但是写入附加元素的区域与 s2
的元素所在的内存完全相同。驻留,因此 s2
的元素也被覆盖了。
关于go - 在golang中连接2个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46305812/