Go語言中Slice(切片)初探

2021-08-09 06:36:08 字數 925 閱讀 8702

最近上課學習go語言,看go語言指南,裡面說:乙個 slice 會指向乙個序列的值,並且包含了長度資訊,為了指定容量,可傳遞第三個引數到 make。感覺有些懵比,指向乙個序列的值?指定容量?

我就在go指南上互動的地方做了點嘗試。(本人蒟蒻,如有錯誤,希望大佬指出的時候不要激動。)

乙個slice(切片)是乙個陣列片段的描述。它包含了指向陣列的指標,片段的長度, 和容量(片段的最大長度)。

我覺得這一點可以通過slice的基於底層陣列建立的方法得到比較直觀的體現:

var a = [3]int 

h:=a[:]

切片是引用型別,如果你將乙個切片賦值給另外乙個切片,這兩個切片指向的是同乙個底層陣列。

在go指南互動介面輸入以下**,可以發現切片指向底層陣列,所以指南才會說「乙個 slice 會指向乙個序列的值」吧。

go指南裡面有這樣一段**,如下圖。

開始我不理解,為什麼c的len是2,d的cap是3。切片包含了指向陣列的指標,而len我們可以理解成能夠通過下標訪問的元素數量,cap則是切片指向的陣列分配的記憶體能容納的元素數量。

c := b[:2]

切片c指向的陣列起始位置仍然是b[0]的位址,而切片操作是:2,所以c能通過下標訪問的元素數量是2。而b指向的陣列分配的記憶體可以容納5個元素,c的cap和b一樣是5。

d := c[2:5]

切片d指向的陣列起始位置是c[2]也就是b的第三個元素,因為b分配的記憶體只能容納5個元素,d指向的元素已經是第三個了,自然容量(cap)只有3了。

Go語言切片 Slice

python裡面切片是一種操作,用於取list裡面元素。而go語言的切片則是一種資料型別,而不是一種操作。go語言中提供了切片 slice 作為一種更為靈活 功能強悍的內建型別,它其實是陣列的一種抽象。切片的原始碼 type slice struct slice是原陣列在記憶體中的位址的乙個指標,它...

Go語言核心 slice切片

slice是長度可變的元素序列 陣列不可變 每個元素都有相同的型別。slice型別寫作t,其中t代表slice中的元素型別 slice和陣列寫法很像,只是沒有指定長度。陣列和slice之間的聯絡非常緊密。slice是非常輕量的資料結構,它是引用型別,指向底層的乙個陣列,該陣列被稱之為slice的底層...

go語言基礎 切片 slice

理解為變長的陣列 a 切片建立 s1 int s2 make t,len,cap arr 5 int s3 arr start end 切割陣列 start,end s4 arr b 切片的型別 資料型別 切片屬於引用型別 s1 int s2 s1 packagemain import fmt fu...