🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **1.切片声明** 切片是一个拥有相同类型元素的可变长度的序列。 切片是一个引用类型,它的内部包含`地址`、`长度`和`容量`。 ``` var name []T // name表示变量名,T表示类型 // 例子: var str []string ``` ## **2.切片的长度和容量** 切片有自己的长度和容量,可以通过内置的`len()`函数求长度,用内置的`cap()`函数求容量。 ## **3.切片表达式** 切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。 两种表达式: 一种指定low和high两个索引界限值得简单形式,另外一种在第一种的基础上还指定容量的完整的形式。 **简单表达式** ~~~go func main() { a := [5]int{1, 2, 3, 4, 5} s := a[1:3] // s := a[low:high] fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s)) } ~~~ 输出: ``` s:[2 3] len(s):2 cap(s):4 ``` 对于数组或字符串,如果`0 <= low <= high <= len(a)`,则索引合法,否则会索引越界。 **完整表达式** 对于数组,指向数组的指针,或切片a(注意不能是字符串)支持完整切片表达式: ``` a[low : high : max] ``` 完整切片表达式需要满足的条件是`0 <= low <= high <= max <= cap(a)`,其他条件和简单切片表达式相同。 ## **4.使用make()函数构造切片** 如果需要动态创建切片,就需要用到内置的`make()`函数,格式如下: ``` make([]T, size, cap) ``` ## 5.切片的本质 切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。 举例:现在有一个数组`a := [8]int{0, 1, 2, 3, 4, 5, 6, 7}`,切片`s1 := a[:5]`,相应示意图如下。 ![](https://img.kancloud.cn/41/00/4100d1cedd69b25939a109be8fbb565b_979x392.png) 切片`s2 := a[3:6]`,相应示意图如下: ![](https://img.kancloud.cn/c2/12/c21280e717a5b446d77ad26ad315626b_932x352.png) ## 6.判断切片是否为空 要检查切片是否为空,请始终使用`len(s) == 0`来判断,而不应该使用`s == nil`来判断。