分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
###### 在go中,slice底层是引用的数组, 当slice进行扩容的时候,如果超出了原先设定的范围,引用的对象会发生变化,当然容量和长度也会发生改变,下面我们用数组的切片进行slice的赋值,看看发生了什么
```go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[:3]
slice01:= arr[1:3]
slice02:= arr[0:1]
fmt.Printf("slice before: %v , the len: %v , the cap: %v \n",slice, len(slice), cap(slice))
slice[1]=100
fmt.Printf("arr[1] : %v \n",arr[1])
//观察切片赋值的时候是什么因素决定了slice容量
fmt.Printf("slice01 : %v , the len: %v , the cap: %v \n",slice01, len(slice01), cap(slice01))
fmt.Printf("slice02 : %v , the len: %v , the cap: %v \n",slice01, len(slice02), cap(slice02))
slice=append(slice, 4,5,6)
//扩容后的容量变成什么了?还有引用的变化
fmt.Printf("slice after: %v , the len: %v , the cap: %v \n",slice, len(slice), cap(slice))
//我们尝试再次改变slice的值
slice[1]=1000
fmt.Printf("arr[1] : %v \n",arr[1])
}
```
以下是上面程序的输出:
```
slice before: [1 2 3] , the len: 3 , the cap: 5
arr[1] : 100 //arr[1]的值对应slice[1]的值,这和我们设想的一样
slice01 : [100 3] , the len: 2 , the cap: 4 //切片赋值时,slice的cap容量只是和开始索引有关系,cap=引用对象的cap - 开始索引
slice02 : [100 3] , the len: 1 , the cap: 5
slice after: [1 100 3 4 5 6] , the len: 6 , the cap: 10 //容量是之前数组的cap的2倍 : 5-->10
arr[1] : 100 //arr[1]的值并没有改变成1000,可见,引用的数组已经不是原先的那个arr了
```
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3153 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传