Go語言基礎(chǔ) 切片使用
Go 中常用的容器
Golang 中以標(biāo)準(zhǔn)庫的方式提供了常用的容器實(shí)現(xiàn),基本能夠滿足我們?nèi)粘i_發(fā)的需要。我們來具體學(xué)習(xí)下 Go 數(shù)組的使用。
切片
切片是對(duì)數(shù)組一個(gè)連續(xù)片段的引用,它是一個(gè)容量可變的序列。我們可以簡(jiǎn)單將切片理解為動(dòng)態(tài)數(shù)組,它的內(nèi)部結(jié)構(gòu)包括底層數(shù)組指針、大小和容量,它通過指針引用底層數(shù)組,把對(duì)數(shù)據(jù)的讀寫操作限定在指定的區(qū)域內(nèi)。
切片的結(jié)構(gòu)體由三部分組成:
array
?是指向底層存儲(chǔ)數(shù)據(jù)數(shù)組的指針;len
?指當(dāng)前切片的長(zhǎng)度,即成員數(shù)量;cap
?指當(dāng)前切片的容量,它總是大于等于?len
。
我們可以從原有數(shù)組中生成一個(gè)切片,那么生成的切片指針即指向原數(shù)組,生成的樣式如下:
source
表示生成切皮的原有數(shù)組,begin
?表示切片的開始位置,end
?表示切片的結(jié)束位置,不包含?end
?索引指向的成員。具體效果如下例子所示:
輸出的結(jié)果為:
在這個(gè)切片內(nèi),我們僅能訪問長(zhǎng)度內(nèi)的值,如果訪問的下標(biāo)超過了切片的長(zhǎng)度,編譯器將會(huì)拋出下標(biāo)越界的異常。如果此時(shí)我們對(duì)切片內(nèi)的成員進(jìn)行修改,因?yàn)榍衅鳛橹赶蛟袛?shù)組的引用,對(duì)切片進(jìn)行修改就是對(duì)原有數(shù)組進(jìn)行修改,如下例子所示:
結(jié)果如下所示:
上面例子中我們修改了切片中的值,直接導(dǎo)致原數(shù)組中的值也發(fā)生了變化。
我們也可以通過?make
?函數(shù)動(dòng)態(tài)創(chuàng)建切片,在創(chuàng)建過程中指定切片的長(zhǎng)度和容量,樣式如下所示:
T
?即切片中的成員類型,size
?為當(dāng)前切片具備的長(zhǎng)度,cap
?為當(dāng)前切片預(yù)分配的長(zhǎng)度,即切片的容量。例子如下所示:
輸出的結(jié)果如下:
從上述輸出可以看到?make
?函數(shù)創(chuàng)建的新切片中的成員都被初始化為類型的初始值。
切片本質(zhì)就是一個(gè)結(jié)構(gòu)體,他里面包含三部分:address + len + cap,因此作為一個(gè)引用空間,該空間和元素空間完全是兩個(gè)空間,所以切片的首地址和頭號(hào)元素的首地址完全不同。