如何解决为什么一遍又一遍地分配切片变量不会被覆盖?
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)
}
在此程序中,为什么一次又一次重新分配变量s
的值不会被覆盖?
为什么当我们将其长度从0
扩展到4
时,它仍将基础值保留在相同的索引处?
编辑:我按照建议阅读了切片内部,并且我了解切片只是对底层数组的视图,但是,我的问题是,当仅使用s1,s2,s3
时,而不是使用s
变量名一遍又一遍地使用,内部发生了什么,为什么同一个变量没有被覆盖?
解决方法
这与Go中切片的工作方式有关。基本上,切片是一个包含三样东西的数据结构:
- 指向支持数组的指针。
- 长度(数组中“正在使用”的元素的数量)。
- 容量(后备阵列中的索引总数(阵列是固定大小))。
编写s = s[:0]
时,您正在做的事情是创建一个新切片,该切片具有指向相同后备数组的指针,但长度不同。以后再写s = s[:4]
时,它又是相同的后备数组,因此s[:0]
隐藏的元素仍然存在。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。