###### 在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了
```