欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:Golang----切片

柚子快報激活碼778899分享:Golang----切片

http://yzkb.51969.com/

一、切片與數組的區(qū)別

(1)切片是一個長度可變的數據類型,其長度在定義時可以為空,也可以指定一個初始長度。數組是一個長度固定的數據類型,其長度在定義時就已經確定了,不能動態(tài)改變。

(2)切片的內存空間是在運行時動態(tài)分配的,其大小可以改變;數組的內存空間是在定義時分配的,其大小是固定的。

(3)切片作為函數的參數時,傳遞的是底層數組。函數操作切片的引用,會影響底層數組;數組作為函數參數時,函數操作的是數組的一個副本,不會影響原始數組。

(4)切片有容量的概念,指的是分配的內存空間。且切片本身是一個結構體。

二.切片自身結構體及與底層數組

在Golang里,切片本身是一個結構體,包含三個字段。

type slice struct{

array unsafe.Pointer //指向第一個元素的地址

len int

cap int

}

1.指針: 指向 slice 可以訪問到的第一個元素。 2.長度: slice 中元素個數。 3.容量: slice 起始元素到底層數組最后一個元素間的元素個數。

當切片是截取已定義數組而定義時,切片是數組的一個引用,修改切片的值會直接修改數組的值。當直接通過make定義切片或直接聲明切片或基于另一個切片定義時,切片的底層數組對程序員是不可見的,只能通過切片操作底層數組。(當切片基于另一個切片定義時,兩者共享同一個底層數組)

三、切片的擴容機制

Go 中切片的擴容機制是基于動態(tài)數組的,這意味著切片的底層數組會動態(tài)調整大小以適應元素的增加。下面是 Go 切片擴容的一般過程:

1.初始分配:

當使用 make 創(chuàng)建一個切片時,Go 會為其分配一塊初始的底層數組

2.追加元素:

使用 append 向切片追加元素時,Go 會檢查是否有足夠的容量來容納新的元素。如果有足夠的容量,新元素會被添加到底層數組的末尾,切片的長度會增加。如果沒有足夠的容量,就需要進行擴容。

3.擴容:

當切片需要擴容時,Go 會創(chuàng)建一個新的更大的底層數組(具體的擴容策略看下面擴容原理)。然后,原數組的元素會被復制到新數組中,新元素會被添加到新數組的末尾。最后,切片的引用會指向新的底層數組,原數組會被垃圾回收。

擴容過程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.如果期望容量大于當前容量的兩倍就會使用期望容量; 2.如果當前切片的長度小于閾值(默認 256)就會將容量翻倍; 3.如果當前切片的長度大于等于閾值(默認 256),就會每次增加 25% 的容量,基準是 newcap + 3*threshold,直到新容量大于期望容量;

總的來說,Go的設計者不斷優(yōu)化切片擴容的機制,其目的只有一個:就是控制讓小的切片容量增長速度快一點,減少內存分配次數,而讓大切片容量增長率小一點,更好地節(jié)省內存。

如果只選擇翻倍的擴容策略,那么對于較大的切片來說,現有的方法可以更好的節(jié)省內存。 如果只選擇每次系數為1.25的擴容策略,那么對于較小的切片來說擴容會很低效。 之所以選擇一個小于2的系數,在擴容時被釋放的內存塊會在下一次擴容時更容易被重新利用

柚子快報激活碼778899分享:Golang----切片

http://yzkb.51969.com/

文章來源

評論可見,查看隱藏內容

本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉載請注明,如有侵權,聯系刪除。

本文鏈接:http://gantiao.com.cn/post/18952669.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄