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