Arrays 为什么反复赋值时slice变量不会被覆盖?

Arrays 为什么反复赋值时slice变量不会被覆盖?,arrays,go,slice,Arrays,Go,Slice,在这个程序中,为什么变量s的值在一次又一次重新赋值时没有被覆盖 为什么当我们将它的长度从0扩展到4时,它仍然在相同的索引中保留基础值 编辑:我按照建议阅读了slice内部,我知道slice只是底层数组的视图,但是,我的问题是,当只反复使用s时,不要使用s1、s2、s3变量名,内部发生了什么以及为什么不覆盖同一变量?这与Go中切片的工作方式有关。基本上,切片是一种数据结构,包含三项内容: 指向支持数组的指针 长度(数组中“正在使用”的元素数) 容量(支持数组中的索引总数(数组大小固定)) 编写s=

在这个程序中,为什么变量
s
的值在一次又一次重新赋值时没有被覆盖

为什么当我们将它的长度从
0
扩展到
4
时,它仍然在相同的索引中保留基础值


编辑:我按照建议阅读了slice内部,我知道slice只是底层数组的视图,但是,我的问题是,当只反复使用
s
时,不要使用
s1、s2、s3
变量名,内部发生了什么以及为什么不覆盖同一变量?

这与Go中切片的工作方式有关。基本上,切片是一种数据结构,包含三项内容:

  • 指向支持数组的指针
  • 长度(数组中“正在使用”的元素数)
  • 容量(支持数组中的索引总数(数组大小固定))

  • 编写
    s=s[:0]
    时要做的是创建一个新切片,该切片的指针指向相同的后备数组,但长度不同。当您稍后编写
    s=s[:4]
    时,它还是同一个支持数组,因此
    s[:0]
    隐藏的元素仍然存在。

    请阅读以了解切片的工作原理。@Marc抱歉,这对我来说回答不够清楚,我了解到切片是对数组的引用,因此所做的更改将影响基础数组。我对使用同一个变量更为困惑,该变量被多次赋值,但仍然保持不变。
    func main() {
        s := []int{2, 3, 5, 7, 11, 13}
        printSlice(s)
    
        // Slice the slice to give it zero length.
        s = s[:0]
        printSlice(s)
    
        // Extend its length.
        s = s[:4]
        printSlice(s)
    
        // Drop its first two values.
        s = s[2:]
        printSlice(s)
    }
    
    func printSlice(s []int) {
        fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
    }