Go開發(fā)工程師
未來3-5年企業(yè)高性能項(xiàng)目不可替代的語言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通
切片(Slice)與數(shù)組一樣,也是可以容納若干類型相同的元素的容器。與數(shù)組不同的是,無法通過切片類型來確定其值的長度。每個(gè)切片值都會(huì)將數(shù)組作為其底層數(shù)據(jù)結(jié)構(gòu)。我們也把這樣的數(shù)組稱為切片的底層數(shù)組。
表示切片類型的字面量如:
[]int
或
[]string
可以看到,它們與數(shù)組的類型字面量的唯一不同是不包含代表其長度的信息。因此,不同長度的切片值是有可能屬于同一個(gè)類型的。相對(duì)的,不同長度的數(shù)組值必定屬于不同類型。對(duì)一個(gè)切片類型的聲明可以這樣:
type MySlice []int
這時(shí),類型MySlice即為切片類型[]int的一個(gè)別名類型。除此之外,對(duì)切片值的表示也與數(shù)組值也極其相似,如:
[]int{1, 2, 3}
這樣的字面量與數(shù)組(值)的字面量的區(qū)別也只在于最左側(cè)的類型字面量。
我們?cè)谏弦还?jié)講到的操作數(shù)組值的方法也同樣適用于切片值。不過,還有一種操作數(shù)組值的方法我們沒講到。這種操作的名稱就叫“切片”。實(shí)施切片操作的方式就是切片表達(dá)式。舉例如下:
var numbers3 = [5]int{1, 2, 3, 4, 5}
var slice1 = numbers3[1:4]
請(qǐng)注意第二條賦值語句中在“=”右邊那個(gè)部分。切片表達(dá)式一般由字符串、數(shù)組或切片的值以及由方括號(hào)包裹且由英文冒號(hào)“:”分隔的兩個(gè)正整數(shù)組成。這兩個(gè)正整數(shù)分別表示元素下界索引和元素上界索引。在本例中,切片表達(dá)式numbers3[1:4]的求值結(jié)果為[]int{2, 3, 4}??梢?,切片表達(dá)式的求值結(jié)果相當(dāng)于以元素下界索引和元素上界索引作為依據(jù)從被操作對(duì)象上“切下”而形成的新值。注意,被“切下”的部分不包含元素上界索引指向的元素。另外,切片表達(dá)式的求值結(jié)果會(huì)是切片類型的,且其元素類型與被“切片”的值的元素類型一致。實(shí)際上,slice1這個(gè)切片值的底層數(shù)組正是numbers3的值。
實(shí)際上,我們也可以在一個(gè)切片值上實(shí)施切片操作。操作的方式與上述無異。請(qǐng)看下面這個(gè)例子:
var slice2 = slice1[1:3]
據(jù)此,slice2的值為[]int{3, 4}。注意,作為切片表達(dá)式求值結(jié)果的切片值的長度總是為元素上界索引與元素下界索引的差值。
除了長度,切片值以及數(shù)組值還有另外一個(gè)屬性——容量。數(shù)組值的容量總是等于其長度。而切片值的容量則往往與其長度不同。請(qǐng)看下圖。

如圖所示,一個(gè)切片值的容量即為它的第一個(gè)元素值在其底層數(shù)組中的索引值與該數(shù)組長度的差值的絕對(duì)值。為了獲取數(shù)組、切片或通道類型的值的容量,我們可以使用內(nèi)建函數(shù)cap,如:
var capacity2 int = cap(slice2)
最后,要注意,切片類型屬于引用類型。它的零值即為nil,即空值。如果我們只聲明一個(gè)切片類型的變量而不為它賦值,那么該變量的值將會(huì)是nil。例如,若有這樣一個(gè)變量:
var slice3 []int
則它的值會(huì)是
nil
請(qǐng)?jiān)诿钤创a文件index.go的第 8 行和第 9 行的圓括號(hào)中分別填入一個(gè)數(shù)字,使程序打印到標(biāo)準(zhǔn)輸出上的內(nèi)容為true, true。
應(yīng)該分別填入3和3。計(jì)算方法請(qǐng)參見“知識(shí)要點(diǎn)”。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)