删除切片中的元素导致更改为原始切片?

时间:2017-05-23 09:40:40

标签: go

我只是展示代码,非常简单,go play

package main

import (
    "fmt"
)

func main() {
    a := []int{1,2,3,4,5,6}
    for i:=0 ; i < len(a); i++ {
        b := append(a[:i], a[i+1:]...)
        fmt.Println(b)
    }
    fmt.Println(a)
}

在上面的代码中,我有一个切片,我想在循环中删除它的元素。

我希望输出结果是:

23456
13456
12356
12346
12345

但我得到了:

[2 3 4 5 6]
[2 4 5 6 6]
[2 4 6 6 6]
[2 4 6 6 6]
[2 4 6 6 6]
[2 4 6 6 6]

为什么呢? go document说如果切片的容量不够,它会对元素进行重新分配,我甚至改变了原始切片中的任何内容......

有人可以解释一下这是怎么发生的吗?

2 个答案:

答案 0 :(得分:0)

我想我知道为什么。

切片a [:i]将返回一个容量大小为6的切片(作为原始切片),因此追加将不会重新分配新切片但使用原始切片。

答案 1 :(得分:0)

 b := append(a[:i], a[i+1:]...)

此代码将更改Slice。 我的代码:

func main() {
    a := []int{1, 2, 3, 4, 5, 6}
    for i := 0; i < len(a); i++ {
        a1 := make([]int,6)
        copy(a1, a)
        b := make([]int,5)
        b = a1[:i]
        b = append(b, a1[i+1:]...)
        fmt.Println(b)
    }
    fmt.Println(a)
}