<p align="right">2021年08月31日 13:54:49</p>
[TOC]
1. 切片:切片是数组的一个引用,是引用类型。但自身是结构体,值拷贝传递
2. 切片的长度可以改变,因此,切片是一个可变的数组
3. 切片遍历方式和数组一样,可以用len()求长度。表示可用你袁术数量,读写操作不能超过该限制
4. cap可以求出slice最大扩张容量,不能超出数组限制。
5. `0 <= len(slice) <= len(array)`,其中array是slice引用的数组
6. 切片的定义:`var 变量名 []类型`,例如`var str []string`、`var arr []int`
7. 如果`slice == nil`, 那么len、cap的结果都等于0
## 创建切片
标准声明
```
var s1 []int
```
通过类型推断
```
s2 := []int{}
```
通过make函数
```
var s3 []int = make([]int, 0)
```
初始化赋值
```
var s4 []int = make([]int, 0, 0)
s5 := []int{1, 2, 3, 4, 5}
s6 := s5[1:4] // 通过数组切片,前包后不包,{2,3,4}
```
## 切片初始化
| 操作 | 含义 |
| --- | --- |
| s[n] | 切片s中年索引位置为n的项 |
|s[:]|从切片s的索引位置0到len(s)-1处所获得的切片|
|s[low:]|从切片s的索引位置low到len(s)-1处所获得的切片|
|s[:high]|从切片s的索引位置0到high处所获得的切片, len=high|
|s[low:high]|从切片s的索引位置low到high处所获得的切片,len=high-low|
|s[low:high:max]|从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low|
|len(s)|切片s的长度,总是<=cap(s)|
|cap(s)|切片s的长度,总是>=len(s)|
代码示例
```
package main
import (
"fmt"
)
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[2:8]
var slice1 []int = arr[0:6] //可以简写为 var slice []int = arr[:end]
var slice2 []int = arr[5:10] //可以简写为 var slice[]int = arr[start:]
var slice3 []int = arr[0:len(arr)] //var slice []int = arr[:]
var slice4 = arr[:len(arr)-1] //去掉切片的最后一个元素
func main() {
fmt.Printf("全局变量:arr %v\n", arr)
fmt.Printf("全局变量:slice0 %v\n", slice0)
fmt.Printf("全局变量:slice1 %v\n", slice1)
fmt.Printf("全局变量:slice2 %v\n", slice2)
fmt.Printf("全局变量:slice3 %v\n", slice3)
fmt.Printf("全局变量:slice4 %v\n", slice4)
fmt.Printf("-----------------------------------\n")
arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
slice5 := arr[2:8]
slice6 := arr[0:6] //可以简写为 slice := arr[:end]
slice7 := arr[5:10] //可以简写为 slice := arr[start:]
slice8 := arr[0:len(arr)] //slice := arr[:]
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素
fmt.Printf("局部变量: arr2 %v\n", arr2)
fmt.Printf("局部变量: slice5 %v\n", slice5)
fmt.Printf("局部变量: slice6 %v\n", slice6)
fmt.Printf("局部变量: slice7 %v\n", slice7)
fmt.Printf("局部变量: slice8 %v\n", slice8)
fmt.Printf("局部变量: slice9 %v\n", slice9)
}
```
输出结果
```
全局变量:arr [0 1 2 3 4 5 6 7 8 9]
全局变量:slice0 [2 3 4 5 6 7]
全局变量:slice1 [0 1 2 3 4 5]
全局变量:slice2 [5 6 7 8 9]
全局变量:slice3 [0 1 2 3 4 5 6 7 8 9]
全局变量:slice4 [0 1 2 3 4 5 6 7 8]
-----------------------------------
局部变量: arr2 [9 8 7 6 5 4 3 2 1 0]
局部变量: slice5 [2 3 4 5 6 7]
局部变量: slice6 [0 1 2 3 4 5]
局部变量: slice7 [5 6 7 8 9]
局部变量: slice8 [0 1 2 3 4 5 6 7 8 9]
局部变量: slice9 [0 1 2 3 4 5 6 7 8]
```
## 通过make创建切片
```
var slice []type = make([]type, len)
slice := make([]type, len)
slice := make([]type, len, cap)
```