AES(Advanced Encryption Standard)是一種對稱加密演算法,它是目前廣泛使用的加密演算法之一。AES演算法是由美國國家標準與技術研究院(NIST)於2001年發佈的,它取代了原先的DES(Data Encryption Standard)演算法,成為新的標準。AES是一種對稱加密... ...
切片的底層數據結構
有上篇string為基礎了,能猜到slice肯定也有一個對應的struct。
在runtime的 slice.go中
type slice struct {
array unsafe.Pointer
len int
cap int
}
切片的本質是對數組的引用
len 表示當前已經存儲的個數,cap表示容量。
切片的創建
-
根據數組創建
s := arr[0:31]
-
字面量:編譯時插入創建數組的代碼
s := []int{1, 2, 3}
-
make:運行時創建數組
slice := make([lint, 10)
切片的追加
擴容時,編譯時轉為調用 runtime.growslice()
有興趣的可以看下源碼,方法介紹也能看出一些邏輯。
直接小結:
1.如果期望容量大於當前容量的兩倍就會使用期望容量
比如當前是3,期望9,那麼即使翻倍也達不到要求,所以直接變成9.
2.如果當前切片的長度小於 1024,將容量翻倍
比如當前容量為3, 如果再加一個值,則容量直接變為 6.
3.如果當前切片的長度大於 1024,每次增加 25%
4.切片擴容時,併發不安全,註意切片併發要加鎖,
因為擴容時候,會新創建一個數組,如果在這個過程中,併發訪問可能會是訪問老的數組。
因為數組必須是連續的存儲空間,所以每次擴容,都會創建一個新的數組。