切片
Go中提供了一種靈活,功能強(qiáng)悍的內(nèi)置類型Slices切片(“動(dòng)態(tài)數(shù)組"),與數(shù)組相比切片的長(zhǎng)度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。
切片中有兩個(gè)概念:一是len長(zhǎng)度,二是cap容量,長(zhǎng)度是指已經(jīng)被賦過(guò)值的最大下標(biāo)+1,可通過(guò)內(nèi)置函數(shù)len()獲得。
容量是指切片目前可容納的最多元素個(gè)數(shù),可通過(guò)內(nèi)置函數(shù)cap()獲得。切片是引用類型,因此在當(dāng)傳遞切片時(shí)將引用同一指針,修改值將會(huì)影響其他的對(duì)象。
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è)切片, 切片需要解包
不過(guò)要注意的是,在容量不足的情況下,append的操作會(huì)導(dǎo)致重新分配內(nèi)存,可能導(dǎo)致巨大的內(nèi)存分配和復(fù)制數(shù)據(jù)代價(jià)。
a = append([]int{0}, a...) 切片頭部添加元素。在開頭一般都會(huì)導(dǎo)致內(nèi)存的重新分配,而且會(huì)導(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è)很小的對(duì)象,它對(duì)底層的數(shù)組(內(nèi)部是通過(guò)數(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ù)組的指針、切片訪問(wèn)的元素的個(gè)數(shù)(即長(zhǎng)度)和切片允許增長(zhǎng)到的元素個(gè)數(shù)(即容量)。
-
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
569瀏覽量
40063 -
數(shù)組
+關(guān)注
關(guān)注
1文章
411瀏覽量
25858 -
切片
+關(guān)注
關(guān)注
1文章
22瀏覽量
8436
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論