#1切片的长度与容量# 切片拥有长度和容量。
切片的长度就是它所包含的元素个数。切片s的长度可通过表达式 len(s) 来获取
切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。切片的容量可以通过表达式cap(s)来获取
你可以通过重新切片来扩展一个切片,给它提供足够的容量。Go的切片类型为处理同类型数据序列提供一个方便而高效的方式。 切片有些类似于其他语言中的数组,但是有一些不同寻常的特性。
Go的数组是值语义。一个数组变量表示整个数组,它不是指向第一个元素的指针(不像 C 语言的数组)。 当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组。 (为了避免复制数组,你可以传递一个指向数组的指针,但是数组指针并不是数组。) 可以将数组看作一个特殊的struct,结构的字段名对应数组的索引,同时成员的数目固定。
本文将深入切片的本质,并讲解它的用法。
#2示例#
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// 截取切片使其长度为 0
s = s[:0]
printSlice(s)
// 拓展其长度
s = s[:4]
printSlice(s)
// 舍弃前两个值
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]
#3程序运行过程#
1,第一个输出为[2,3,5,7,11,13],长度为6,容量为6;
2,左指针和右指针同时指向s[0],所以长度为0,容量为0;
3,左指针指向s[0],右指针指向s[4],由于切片概念是只包含左边元素不包含右边元素,所以长度为4,但左指针在s[0]处,走过0个元素,所以容量仍然为6
4,在经历步骤3切片后的基础上,左指针指向s[2],右指针指向最右边,所以长度为2,由于左指针走过两个元素,离最右边还剩4个元素,所以容量为4。
#4小结#
本文内容最难理解的是切片的容量,我们可以把容量当做成总长度减去左指针走过的元素值,比如:
s[:0] ——> cap = 6 - 0 =6
s[2:] ——> cap = 6 - 2 = 4