切片的本質是乙個連續記憶體的陣列。
切片由以下三個部分組成:
成員空間+當前成員數+最大成員數
當前成員數即為len,最大成員數即capacity(這個屬性和字串末尾的位元組個數類似),使用len的原因是為了防止切片成員發生越界。
切片是長度可變的,因此在成員數增加的過程中會發生擴容,具體的判斷規則如下:
原有容量為oldcap,現有成員數為cap,新容量為newcap
1.原有容量翻倍後,是否小於現有成員數,是則直接擴容到現有成員數的容量?————如果oldcap*2 < cap,則newcap = cap
2.翻倍後大於現有成員數,則判斷舊容量是否小於1024,如果小於則直接翻倍,擴容100%;
如果大於則1024,則擴容25%
注意最終所得的實際容量並不一定完全等於newcap,而是大於等於newcap,因為golang的記憶體管理模組提前向作業系統申請了記憶體塊(如4位元組、16位元組、32位元組大小),最終分配給切片的,將從這些記憶體塊中合理選擇。
golang筆記 Slice切片
sliceslice代表變長的序列,序列中每個元素都有相同的型別。語法和陣列很像,只是沒有固定長度。引用型別 動態陣列 從概念上來說,slice像乙個結構體,這個結構體包含了三個元素 乙個指標,指向陣列中slice指定的開始位置 長度,即slice的長度 最大長度,也就是slice開始位置到陣列的最...
golang學習(九) 切片(slice)
在go 語言中,陣列是值型別,長度是固定的 而切片是引用型別,長度可動態增長。切片的內部結構包括位址 大小和容量。特性 1.當省略開始位置時,表示從連續區域開頭到結束位置。2.當省略結束位置時,表示從開始位置到整個連續區域結束位置。3.兩者都省略時,與切片本身等效。基本格式如下 slice 開始位置...
golang中切片 slice 的坑
golang中陣列的長度是不可以變得,但是某些場合就不使用了,go提供了一種靈活,功能強悍的型別 切片,切片中有兩種概念 一種是len長度,二是cap容量,長度是已經被賦值的最大下標 1,可以通過len函式獲得切片的長度。容量是指切片最大可容納多少個元素,可以通過cap函式獲得,切片是引用型別,因此...