这就是内置的append() 函数的用途:将值(可能是切片的值)附加到另一个的末尾。结果就是串联。
如果您希望s3“独立”于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)
两种情况下的输出(在Go Playground 上试试):
[1 2 3 4 5 3 4 5 6 7]
注意:这个“重叠”的意思是,如果你将值附加到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)
输出是(在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 的元素),所以它没有创建新数组,它只是重新切片s1 并添加元素“到位”。但是写入附加元素的区域与 s2 的元素所在的内存完全相同,因此 s2 的元素也被覆盖了。