go專家程式設計系列(2)常見資料結構 slice

2021-10-18 05:09:19 字數 2397 閱讀 9393

slice的實現原理

又稱動態陣列,依託陣列實現,可以方便地進行擴容和傳遞,實際使用時比陣列更靈活。

type slice struct

以上是go中slice的宣告。

簡單表示式

a[low : hihg]

如果 a 為陣列或者切片,則該表示式將切取a[ low , high )的元素,如果 a 為string 該表示式將會生成乙個string,而不是slice

a :=[5

]int

b := a[1:

4]b[0

]=2c := b[1:

2]

根據之前切片結構的宣告,我們知道 slice 有三個元素,對於array(底層陣列位址),著重強調,使用簡單表示式生成的slice將與原陣列或slice共享底層陣列,新切片的生成邏輯可以理解為

b.array =

&a[low]

b.len

= heigh - low

b.cap

=len

(a)- low //注意 b 的 cap 不是 len(b)

大家可以試試以下**的輸出

func

sliceprint()

s2 := s1

s3 := s2[:]

fmt.

printf

("%p %p %p\n"

,&s1[0]

,&s2[0]

,&s3[0]

)}func

slicecap()

var slice = array[5:

6]var slice2 = array[9:

10]fmt.

printf

("len(slice) = %d\n"

,len

(slice)

) fmt.

printf

("cap(slice) = %d\n"

,cap

(slice)

)

fmt.

printf

("len(slice) = %d\n"

,len

(slice2)

) fmt.

printf

("cap(slice) = %d\n"

,cap

(slice2)

)}

另外,需要注意,如果簡單表示式的物件是slice,那麼表示式a[low : high]中 low 和 high 的最大值可以是 a 的容量,而不是 a 的長度

擴充套件表示式

a[low : high : max]

a  :=[5

]slice

b := a[1:

4]b =(b,0)

fmt.

println

(a[4])

//0

而擴充套件表示式就是解決這個問題的機制 ,low high max 滿足0 <= low <= high <= max <= cap(a)max用於限制新生成切片的容量,新切片的容量為max - low

array :=[10

]int

a := array[5:

7]//cap = 5

b := array[5:

7:7]

//cap = 2

slice的使用很靈活,但是想要正確使用它,就要了解它的實現原理。

ps := new(string)slice

slice 依託陣列實現,底層陣列對使用者遮蔽嗎在底層陣列容量不足時可以實現自動分配並生成新的slice

擴容擴容容量的選擇遵守以下規則

newcap := old.

cap doublecap := newcap + newcap

ifcap

> doublecap

else

else

// set newcap to the requested cap when

// the newcap calculation overflowed.

if newcap <=0}

}

在此規則之上,還會考慮元素型別與記憶體分配規則,對實際擴張值做一些微調。比如,os常常將記憶體切分為 64、80、96、112 等常用的大小 go的記憶體分配機制會根據預估大小匹配合適的記憶體塊分配給新slice。

go專家程式設計系列(1)常見資料結構 string

string in golang 總結hello世界字元 編號二進位制 h104 0110 1000 e101 0110 0101 l108 0110 1100 l108 0110 1100 o111 0110 0111 世19990 01001110 00010110 界30028 0111010...

go專家程式設計系列(3)常見資料結構 iota

我們知道iota常用於cost表示式中,其值是從0開始的,const宣告快中每增一行,iota值自增1 const a0,b0 1 iota,1 iota 1 a1,b1 a3,b3 注意iota識別符號只能用於常量表示式中,那麼想要了解iota是如何運作的,就要看看go的編譯器是如何處理常量宣告的...

常見資料結構

陣列 array 在程式設計中,為了處理方便,把具有相同型別的若干變數按有序的形式組織起來。這些按序排列的同類資料元素的集合稱為陣列。在c語言中,陣列屬於構造資料型別。乙個陣列可以分解為多個陣列元素,這些陣列元素可以是基本資料型別或是構造型別。因此按陣列元素的型別不同,陣列又可分為數值陣列 字元陣列...