切片(Slice)与数组同样,也是能够容纳若干类型相同的元素的容器。与数组不一样的是,没法经过切片类型来肯定其值的长度。每一个切片值都会将数组做为其底层数据结构。咱们也把这样的数组称为切片的底层数组。
表示切片类型的字面量如:数组
[]int
或数据结构
[]string
能够看到,它们与数组的类型字面量的惟一不一样是不包含表明其长度的信息。所以,不一样长度的切片值是有可能属于同一个类型的。相对的,不一样长度的数组值一定属于不一样类型。对一个切片类型的声明能够这样:函数
type MySlice []int
这时,类型MySlice
即为切片类型[]int
的一个别名类型。除此以外,对切片值的表示也与数组值也极其类似,如:spa
[]int{1, 2, 3}
这样的字面量与数组(值)的字面量的区别也只在于最左侧的类型字面量。
咱们在上一节讲到的操做数组值的方法也一样适用于切片值。不过,还有一种操做数组值的方法咱们没讲到。这种操做的名称就叫“切片”。实施切片操做的方式就是切片表达式。举例以下:3d
var numbers3 = [5]int{1, 2, 3, 4, 5} var slice1 = numbers3[1:4]
请注意第二条赋值语句中在“=”右边那个部分。切片表达式通常由字符串、数组或切片的值以及由方括号包裹且由英文冒号“:”分隔的两个正整数组成。这两个正整数分别表示元素下界索引和元素上界索引。在本例中,切片表达式numbers3[1:4]
的求值结果为[]int{2, 3, 4}
。可见,切片表达式的求值结果至关于以元素下界索引和元素上界索引做为依据从被操做对象上“切下”而造成的新值。注意,被“切下”的部分不包含元素上界索引指向的元素。另外,切片表达式的求值结果会是切片类型的,且其元素类型与被“切片”的值的元素类型一致。实际上,slice1
这个切片值的底层数组正是numbers3
的值。
实际上,咱们也能够在一个切片值上实施切片操做。操做的方式与上述无异。请看下面这个例子:code
var slice2 = slice1[1:3]
据此,slice2
的值为[]int{3, 4}
。注意,做为切片表达式求值结果的切片值的长度老是为元素上界索引与元素下界索引的差值。
除了长度,切片值以及数组值还有另一个属性——容量。数组值的容量老是等于其长度。而切片值的容量则每每与其长度不一样。请看下图。
如图所示,一个切片值的容量即为它的第一个元素值在其底层数组中的索引值与该数组长度的差值的绝对值。为了获取数组、切片或通道类型的值的容量,咱们能够使用内建函数cap
,如:对象
var capacity2 int = cap(slice2)
最后,要注意,切片类型属于引用类型。它的零值即为nil
,即空值。若是咱们只声明一个切片类型的变量而不为它赋值,那么该变量的值将会是nil
。例如,如有这样一个变量:blog
var slice3 []int
索引
则它的值会是ci
nil