【问题标题】:Concatenate 2 slices in golang在golang中连接2个切片
【发布时间】:2018-02-28 13:20:49
【问题描述】:

我有两片,

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)
    }

这看起来很琐碎的问题,但相信我,我找不到解决此问题的单行方案。 我们该怎么办?

【问题讨论】:

    标签: go slice


    【解决方案1】:

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

    如果您希望s3“独立”于s1s2,则将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 的元素也被覆盖了。

    【讨论】:

      【解决方案2】:

      我建议你看看这个页面:https://github.com/golang/go/wiki/SliceTricks

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

      【讨论】:

      • 当然。这很有帮助。 :)
      猜你喜欢
      • 2015-10-23
      • 2014-09-19
      • 2013-04-21
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2017-07-08
      • 2012-09-27
      相关资源
      最近更新 更多