go - 在golang中连接2个 slice

标签 go slice

我有 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 “独立于”s1s2 , 然后追加 s1为空或 nil slice ,然后追加 s2结果:

s3 := append(append([]int{}, s1...), s2...)
fmt.Println(s3)

如果s3可以使用/重叠 s1 ,您可以简单地附加 s2s1 :

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/

相关文章:

python - numpy 数组的每个元素乘法/加法

linux - golang 使用父进程命名空间在 linux 中读取文件

reflection - 为什么 int32(0) 不是 reflect.DeepEqual 在 Golang 中键入零?

http - 将 http.NewServeMux 放入 http.NewServeMux

go - 在启用 pkg/profile 的情况下运行时如何获取示例?

高语 : Reading a File Basics

ruby - ruby 中的并行分配对于两个等效代码片段的工作方式不同

struct - 引用子结构数组的 Golang 问题

arrays - 为什么 Rust 中的 for 循环可以遍历切片或迭代器,而不是数组?

go - 如何检查 slice 界面元素是否具有相同的动态类型?