咱們已經知道,在進行「切片」操做的時候須要指定元素下界索引和元素上界索引,就像這樣:數組
numbers3[1:4]
在有些時候,咱們還能夠在方括號中放入第三個正整數,以下所示:安全
numbers3[1:4:4]
這第三個正整數被稱爲容量上界索引。它的意義在於能夠把做爲結果的切片值的容量設置得更小。換句話說,它能夠限制咱們經過這個切片值對其底層數組中的更多元素的訪問。下面舉個例子。讓咱們先來回顧下在上一節講到的numbers3
和slice1
。針對它們的賦值語句是這樣的:app
var numbers3 = [5]int{1, 2, 3, 4, 5} var slice1 = numbers3[1:4]
這時,變量slice1
的值是[]int{2, 3, 4}
。可是咱們能夠經過以下操做將其長度延展得與其容量相同:函數
slice1 = slice1[:cap(slice1)]
經過此操做,變量slice1
的值變爲了[]int{2, 3, 4, 5}
,且其長度和容量均爲4
。如今,numbers3
的值中的索引值在[1,5)範圍內的元素都被體如今了slice1
的值中。這是以numbers3
的值是slice1
的值的底層數組爲前提的。這意味着,咱們能夠垂手可得地經過切片值訪問其底層數組中對應索引值更大的更多元素。若是咱們編寫的函數返回了這樣一個切片值,那麼獲得它的程序極可能會經過這種技巧訪問到本不該該暴露給它的元素。這是確確實實是一個安全隱患。
若是咱們在切片表達式中加入了第三個索引(即容量上界索引),如:code
var slice1 = numbers3[1:4:4]
那麼在這以後,不管咱們怎樣作都沒法經過slice1
訪問到numbers3
的值中的第五個元素。由於這超出了咱們剛剛設定的slice1
的容量。若是咱們指定的元素上界索引或容量上界索引超出了被操做對象的容量,那麼就會引起一個運行時恐慌(程序異常的一種),而不會有求值結果返回。所以,這是一個有力的訪問控制手段。
雖然切片值在上述方面受到了其容量的限制,可是咱們卻能夠經過另一種手段對其進行不受任何限制地擴展。這須要使用到內建函數append
。append
會對切片值進行擴展並返回一個新的切片值。使用方法以下:對象
slice1 = append(slice1, 6, 7)
經過上述操做,slice1
的值變爲了[]int{2, 3, 4, 6, 7}
。注意,一旦擴展操做超出了被操做的切片值的容量,那麼該切片的底層數組就會被自動更換。這也使得經過設定容量上界索引來對其底層數組進行訪問控制的方法更加嚴謹了。
咱們要介紹的最後一種操做切片值的方法是「複製」。該操做的實施方法是調用copy
函數。該函數接受兩個類型相同的切片值做爲參數,並會把第二個參數值中的元素複製到第一個參數值中的相應位置(索引值相同)上。這裏有兩點須要注意:
1. 這種複製遵循最小複製原則,即:被複制的元素的個數老是等於長度較短的那個參數值的長度。
2. 與append
函數不一樣,copy
函數會直接對其第一個參數值進行修改。
舉例以下:索引
var slice4 = []int{0, 0, 0, 0, 0, 0, 0} copy(slice4, slice1)
經過上述複製操做,slice4
會變爲[]int{2, 3, 4, 6, 7, 0, 0}
。變量