切片(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