切片
Go中提供了一種靈活,功能強(qiáng)悍的內(nèi)置類型Slices切片(“動(dòng)態(tài)數(shù)組"),與數(shù)組相比切片的長度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。
切片中有兩個(gè)概念:一是len長度,二是cap容量,長度是指已經(jīng)被賦過值的最大下標(biāo)+1,可通過內(nèi)置函數(shù)len()獲得。
容量是指切片目前可容納的最多元素個(gè)數(shù),可通過內(nèi)置函數(shù)cap()獲得。切片是引用類型,因此在當(dāng)傳遞切片時(shí)將引用同一指針,修改值將會影響其他的對象。
s := []int {1,2,3 } //直接初始化切片
s := arr[:] //用數(shù)組初始化切片
s = make([]int, 3) //make初始化,有3個(gè)元素的切片, len和cap都為3
s = make([]int, 2, 3) //make初始化,有2個(gè)元素的切片, len為2, cap為3
a = append(a, 1) // 追加1個(gè)元素
a = append(a, 1, 2, 3) // 追加多個(gè)元素, 手寫解包方式
a = append(a, []int{1,2,3}...) // 追加一個(gè)切片, 切片需要解包
不過要注意的是,在容量不足的情況下,append的操作會導(dǎo)致重新分配內(nèi)存,可能導(dǎo)致巨大的內(nèi)存分配和復(fù)制數(shù)據(jù)代價(jià)。
a = append([]int{0}, a...) 切片頭部添加元素。在開頭一般都會導(dǎo)致內(nèi)存的重新分配,而且會導(dǎo)致已有的元素全部復(fù)制1次。
因此,從切片的開頭添加元素的性能一般要比從尾部追加元素的性能差很多。
//切片是地址傳遞
func updateSlice(a []int) {
a[0] = 3
}
func main() {
//切片
var a = []int{1, 2, 3}
c := make([]int, 5)
copy(c, a)
updateSlice(c)
fmt.Println(c)
}
打印
[3 2 3 0 0]
切片的內(nèi)部實(shí)現(xiàn)
切片是一個(gè)很小的對象,它對底層的數(shù)組(內(nèi)部是通過數(shù)組保存數(shù)據(jù)的)進(jìn)行了抽象,并提供相關(guān)的操作方法。
切片是一個(gè)有三個(gè)字段的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)包含 Golang 需要操作底層數(shù)組的元數(shù)據(jù):
這 3 個(gè)字段分別是指向底層數(shù)組的指針、切片訪問的元素的個(gè)數(shù)(即長度)和切片允許增長到的元素個(gè)數(shù)(即容量)。
-
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40756 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
26560 -
切片
+關(guān)注
關(guān)注
1文章
23瀏覽量
8559
發(fā)布評論請先 登錄

請問BGA封裝如何切片?
怎么獲得不同F(xiàn)PGA系列的等效切片計(jì)數(shù)
如何實(shí)現(xiàn)一個(gè)使用V5上至少80%可用切片的設(shè)計(jì)
芯片漏電點(diǎn)FIB切片分析
PCB切片的分類及作用介紹
dubbo-go 中的 TPS Limit 設(shè)計(jì)與實(shí)現(xiàn)
中國移完成了DNN在內(nèi)的完整切片以及多種智能終端切片設(shè)計(jì)實(shí)現(xiàn)方案
網(wǎng)絡(luò)切片的分類 網(wǎng)絡(luò)切片粒度如何選擇
PCB電路板切片的分析

Go并發(fā)模型的實(shí)現(xiàn)原理
5G 網(wǎng)絡(luò)切片之OTN切片和FlexE切片區(qū)別
如何實(shí)現(xiàn)端到端網(wǎng)絡(luò)切片?

golang通過切片創(chuàng)建新的切片

評論