bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

go語言切片源碼講解 go語言切片擴容

GoLang中的切片擴容機制

[5]int 是數組,而 []int 是切片。二者看起來相似,實則是根本上不同的數據結構。

創新互聯專業為企業提供河口網站建設、河口做網站、河口網站設計、河口網站制作等企業網站建設、網頁設計與制作、河口企業網站模板建站服務,10余年河口做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。

切片的數據結構中,包含一個指向數組的指針 array ,當前長度 len ,以及最大容量 cap 。在使用 make([]int, len) 創建切片時,實際上還有第三個可選參數 cap ,也即 make([]int, len, cap) 。在不聲明 cap 的情況下,默認 cap=len 。當切片長度沒有超過容量時,對切片新增數據,不會改變 array 指針的值。

當對切片進行 append 操作,導致長度超出容量時,就會創建新的數組,這會導致和原有切片的分離。在下例中

由于 a 的長度超出了容量,所以切片 a 指向了一個增長后的新數組,而 b 仍然指向原來的老數組。所以之后對 a 進行的操作,對 b 不會產生影響。

試比較

本例中, a 的容量為6,因此在 append 后并未超出容量,所以 array 指針沒有改變。因此,對 a 進行的操作,對 b 同樣產生了影響。

下面看看用 a := []int{} 這種方式來創建切片會是什么情況。

可以看到,空切片的容量為0,但后面向切片中添加元素時,并不是每次切片的容量都發生了變化。這是因為,如果增大容量,也即需要創建新數組,這時還需要將原數組中的所有元素復制到新數組中,開銷很大,所以GoLang設計了一套擴容機制,以減少需要創建新數組的次數。但這導致無法很直接地判斷 append 時是否創建了新數組。

如果一次添加多個元素,容量又會怎樣變化呢?試比較下面兩個例子:

那么,是不是說,當向一個空切片中插入 2n-1 個元素時,容量就會被設置為 2n 呢?我們來試試其他的數據類型。

可以看到,根據切片對應數據類型的不同,容量增長的方式也有很大的區別。相關的源碼包括: src/runtime/msize.go , src/runtime/mksizeclasses.go 等。

我們再看看切片初始非空的情形。

可以看到,與剛剛向空切片添加5個int的情況一致,向有3個int的切片中添加2個int,容量增長為6。

需要注意的是, append 對切片擴容時,如果容量超過了一定范圍,處理策略又會有所不同。可以看看下面這個例子。

具體為什么會是這樣的變化過程,還需要從 源碼 中尋找答案。下面是 src/runtime/slice.go 中的 growslice 函數中的核心部分。

GoLang中的切片擴容機制,與切片的數據類型、原本切片的容量、所需要的容量都有關系,比較復雜。對于常見數據類型,在元素數量較少時,大致可以認為擴容是按照翻倍進行的。但具體情況需要具體分析。

go語言中實現切片(slice)的三種方式

定義一個切片,然后讓切片去引用一個已經創建好的數組。基本語法如下:

索引1:切片引用的起始元素位

索引2:切片只引用該元素位之前的元素

例程如下:

在該方法中,我們未指定容量cap,這里的值為5是系統定義的。

在方法一中,可以用arr數組名來操控數組中的元素,也可以通過slice切片來操控數組中的元素。切片是直接引用數組,數組是事先存在的,程序員是可見的。

通過 make 來創建切片,基本語法如下:

make函數第三個參數cap即容量是可選的,如果一定要自己注明的話,要注意保證cap≥len。

用該方法可以 指定切片的大小(len)和容量(cap)

例程如下:

由于未賦值系統默認將元素值置為0,即:

數值類型數組:????默認值為 0

字符串數組:? ? ? ?默認值為 ""

bool數組:? ? ? ? ? ?默認值為 false

在方法二中,通過make方式創建的切片對應的數組是由make底層維護,對外不可見,即只能通過slice去訪問各個元素。

定義一個切片,直接就指定具體數組,使用原理類似于make的方式。

例程如下:

Golang 中數組(Array)和切片(Slice)的區別

Go 中數組的長度是不可改變的,而 Slice 解決的就是對不定長數組的需求。他們的區別主要有兩點。

數組:

切片:

注意 1

雖然數組在初始化時也可以不指定長度,但 Go 語言會根據數組中元素個數自動設置數組長度,并且不可改變。切片通過 append 方法增加元素:

如果將 append 用在數組上,你將會收到報錯:first argument to append must be slice。

注意 2

切片不只有長度(len)的概念,同時還有容量(cap)的概念。因此切片其實還有一個指定長度和容量的初始化方式:

這就初始化了一個長度為3,容量為5的切片。

此外,切片還可以從一個數組中初始化(可應用于如何將數組轉換成切片):

上述例子通過數組 a 初始化了一個切片 s。

當切片和數組作為參數在函數(func)中傳遞時,數組傳遞的是值,而切片傳遞的是指針。因此當傳入的切片在函數中被改變時,函數外的切片也會同時改變。相同的情況,函數外的數組則不會發生任何變化。

當前文章:go語言切片源碼講解 go語言切片擴容
URL標題:http://vcdvsql.cn/article46/dopjpeg.html

成都網站建設公司_創新互聯,為您提供網站策劃網站營銷網站維護網站收錄品牌網站制作關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營