Go開(kāi)發(fā)工程師
未來(lái)3-5年企業(yè)高性能項(xiàng)目不可替代的語(yǔ)言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門(mén)到精通
我們已經(jīng)知道,在進(jìn)行“切片”操作的時(shí)候需要指定元素下界索引和元素上界索引,就像這樣:
numbers3[1:4]
在有些時(shí)候,我們還可以在方括號(hào)中放入第三個(gè)正整數(shù),如下所示:
numbers3[1:4:4]
這第三個(gè)正整數(shù)被稱(chēng)為容量上界索引。它的意義在于可以把作為結(jié)果的切片值的容量設(shè)置得更小。換句話說(shuō),它可以限制我們通過(guò)這個(gè)切片值對(duì)其底層數(shù)組中的更多元素的訪問(wèn)。下面舉個(gè)例子。讓我們先來(lái)回顧下在上一節(jié)講到的numbers3
和slice1
。針對(duì)它們的賦值語(yǔ)句是這樣的:
var numbers3 = [5]int{1, 2, 3, 4, 5} var slice1 = numbers3[1:4]
這時(shí),變量slice1
的值是[]int{2, 3, 4}
。但是我們可以通過(guò)如下操作將其長(zhǎng)度延展得與其容量相同:
slice1 = slice1[:cap(slice1)]
通過(guò)此操作,變量slice1
的值變?yōu)榱?code class="marker">[]int{2, 3, 4, 5},且其長(zhǎng)度和容量均為4
?,F(xiàn)在,numbers3
的值中的索引值在[1,5)范圍內(nèi)的元素都被體現(xiàn)在了slice1
的值中。這是以numbers3
的值是slice1
的值的底層數(shù)組為前提的。這意味著,我們可以輕而易舉地通過(guò)切片值訪問(wèn)其底層數(shù)組中對(duì)應(yīng)索引值更大的更多元素。如果我們編寫(xiě)的函數(shù)返回了這樣一個(gè)切片值,那么得到它的程序很可能會(huì)通過(guò)這種技巧訪問(wèn)到本不應(yīng)該暴露給它的元素。這是確確實(shí)實(shí)是一個(gè)安全隱患。
如果我們?cè)谇衅磉_(dá)式中加入了第三個(gè)索引(即容量上界索引),如:
var slice1 = numbers3[1:4:4]
那么在這之后,無(wú)論我們?cè)鯓幼龆紵o(wú)法通過(guò)slice1
訪問(wèn)到numbers3
的值中的第五個(gè)元素。因?yàn)檫@超出了我們剛剛設(shè)定的slice1
的容量。如果我們指定的元素上界索引或容量上界索引超出了被操作對(duì)象的容量,那么就會(huì)引發(fā)一個(gè)運(yùn)行時(shí)恐慌(程序異常的一種),而不會(huì)有求值結(jié)果返回。因此,這是一個(gè)有力的訪問(wèn)控制手段。
雖然切片值在上述方面受到了其容量的限制,但是我們卻可以通過(guò)另外一種手段對(duì)其進(jìn)行不受任何限制地?cái)U(kuò)展。這需要使用到內(nèi)建函數(shù)append
。append
會(huì)對(duì)切片值進(jìn)行擴(kuò)展并返回一個(gè)新的切片值。使用方法如下:
slice1 = append(slice1, 6, 7)
通過(guò)上述操作,slice1
的值變?yōu)榱?code class="marker">[]int{2, 3, 4, 6, 7}。注意,一旦擴(kuò)展操作超出了被操作的切片值的容量,那么該切片的底層數(shù)組就會(huì)被自動(dòng)更換。這也使得通過(guò)設(shè)定容量上界索引來(lái)對(duì)其底層數(shù)組進(jìn)行訪問(wèn)控制的方法更加嚴(yán)謹(jǐn)了。
我們要介紹的最后一種操作切片值的方法是“復(fù)制”。該操作的實(shí)施方法是調(diào)用copy
函數(shù)。該函數(shù)接受兩個(gè)類(lèi)型相同的切片值作為參數(shù),并會(huì)把第二個(gè)參數(shù)值中的元素復(fù)制到第一個(gè)參數(shù)值中的相應(yīng)位置(索引值相同)上。這里有兩點(diǎn)需要注意:
1. 這種復(fù)制遵循最小復(fù)制原則,即:被復(fù)制的元素的個(gè)數(shù)總是等于長(zhǎng)度較短的那個(gè)參數(shù)值的長(zhǎng)度。
2. 與append
函數(shù)不同,copy
函數(shù)會(huì)直接對(duì)其第一個(gè)參數(shù)值進(jìn)行修改。
舉例如下:
var slice4 = []int{0, 0, 0, 0, 0, 0, 0} copy(slice4, slice1)
通過(guò)上述復(fù)制操作,slice4
會(huì)變?yōu)?code class="marker">[]int{2, 3, 4, 6, 7, 0, 0}。
請(qǐng)?jiān)诿钤创a文件index.go的第 8、9、13、17、18 和 19 行的圓括號(hào)中分別填入一個(gè)數(shù)字,使程序打印到標(biāo)準(zhǔn)輸出上的內(nèi)容為:
true, true true true, true, true
應(yīng)該分別填入2
、4
、7
、0
、8
和11
。計(jì)算方法請(qǐng)參見(jiàn)“知識(shí)要點(diǎn)”。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)