Go 删除切片中的元素时,赋值给新变量会产生意外结果

Go 删除切片中的元素时,赋值给新变量会产生意外结果,go,append,slice,Go,Append,Slice,在尝试删除切片中的元素时,我看到一些意外行为。下面是我的代码: package main import "fmt" func main() { x := []int{1,2,3,4,5,6,7,8} y := append(x[:3],x[4:]...) fmt.Println(x) fmt.Println(y) } 输出为: [1 2 3 5 6 7 8 8] [1 2 3 5 6 7 8] 我预计产出为: [1 2 3 4 5 6 7 8] [1 2

在尝试删除切片中的元素时,我看到一些意外行为。下面是我的代码:

package main

import "fmt"

func main() {
    x := []int{1,2,3,4,5,6,7,8}
    y := append(x[:3],x[4:]...)
    fmt.Println(x)
    fmt.Println(y)
}

输出为:

[1 2 3 5 6 7 8 8]
[1 2 3 5 6 7 8]
我预计产出为:

[1 2 3 4 5 6 7 8]
[1 2 3 5 6 7 8]
为什么结果不是我所期望的


换句话说,由于没有赋值来更改值
x
,我希望它具有相同的初始化值,但由于某些原因,它没有,并且具有与
y
相同的值,最后一个元素重复。这是一个bug吗?

当有足够的可用空间时,
append
功能将在适当的位置运行。切掉避免这种行为的能力:

y := append(x[:3:3],x[4:]...)

这就是发生的情况,当您追加时,x被更改

x = [1,2,3,  4,5,6,7, 8]
    [1,2,3] [5,6,7,8] # 4th, 5th, 6th, 7th elements are changed
     x[:3]    x[4:]

x = [1,2,3,5,6,7,8,8]

请注意,除非您完全了解正在发生的事情,否则不要盲目地这样做。这种使用
append
删除项目的方式有点像黑客/诡计,其中一部分是为了避免(大多数)不必要的复制。如果您想要/需要高效地删除项目,那么您可能想要的不是简单的切片(可能只是一张地图,或者如果您想要排序,则可能是一个地图的组合)。