Go語言切片 Slice

2021-10-12 11:37:00 字數 4228 閱讀 7293

python裡面切片是一種操作,用於取list裡面元素。而go語言的切片則是一種資料型別,而不是一種操作。

go語言中提供了切片(slice)作為一種更為靈活、功能強悍的內建型別,它其實是陣列的一種抽象。

切片的原始碼

type slice struct

slice是原陣列在記憶體中的位址的乙個指標,它本身也是乙個結構體。slice建立在陣列基礎之上,建立乙個slice需要首先建立乙個陣列。

go語言的陣列同其他語言一樣,一經定義,大小就不能改變。這在很多情況下很不方便。因此go語言內建了切片這種資料型別。切片是陣列的一種抽象,但它建立的陣列基礎之上。與陣列相比,切片只儲存了原陣列的指標、長度、容量等資訊,它的長度是不固定的,可以從陣列中擷取一部分作為切片,也可以動態擴容。

切片宣告等價於陣列宣告不指定陣列大小,如下:

var slice_name [

]type

因此宣告陣列時一定要指明陣列大小,否則會錯誤的宣告成切片。

也可以使用make()函式來宣告切片,並初始化:

var slice_name [

]type

=make([

]type

, length)

// 可以簡寫為

slice_name :=

make([

]type

, length)

// 也可以指定初始容量

silce_name :=

make([

]type

, length, capacity)

go語言的切片,初始化方法除了make()函式可以通過類似於陣列的花括號,也支援通過對陣列進行類python那樣的切片操作得到,非常靈活,但不支援間隔元素擷取。

例項如下:

slice :=

int

slice := arr[

:]

slice := arr[startindex:endindex]
startindexendindex都是可選的,下同。

也可以通過切片來初始化切片:

s = slice[startindex:endindex]
len()函式可以獲取陣列的長度切片的當前長度

cap()函式則可以獲取切片的當前能達到的最大長度,即容量

例項如下:

package main

import

"fmt"

func

main()

// slice = [0 0 0] slice lengtn=3 slice capacity=5

該例可以看出slice預設元素值為0。

注:切片在未經初始化前預設為nil,長度為0。

go語言中的切片支援類python的元素擷取操作,但不支援間隔擷取。

語法如下

slice := arr[low:high:max]
package main

import

"fmt"

func

main()

fmt.

println

(arr[2:

8])}

// [3 4 5 6 7 8]

起始索引和結束索引同樣可選。

copy函式則用於複製元素。

例項如下:

package main

import

"fmt"

func

printsliceinfo

(s [

]int

)func

main()

printsliceinfo

(slice)

slice =

(slice,4)

printsliceinfo

(slice)

slice =

(slice,5,

6,7,

8,9,

10)printsliceinfo

(slice)

slice_copy :=

make([

]int

,len

(slice),(

cap(slice)*2

))copy

(slice_copy, slice)

printsliceinfo

(slice_copy)

}// current slice=[1 2 3] length=3 capacity=3

// current slice=[1 2 3 4] length=4 capacity=6

// current slice=[1 2 3 4 5 6 7 8 9 10] length=10 capacity=12

// current slice=[1 2 3 4 5 6 7 8 9 10] length=10 capacity=24

注意capacity如何變化。

package main

import

("fmt"

)func

printsliceinfo

(s [

]int

)func

main()

slice := arr[1:

3:4]

printsliceinfo

(slice)

slice =

(slice,6)

printsliceinfo

(slice)

slice =

(slice,7)

printsliceinfo

(slice)

}// current slice=[2 3] length=2 capacity=3

// current slice=[2 3 6] length=3 capacity=3

// current slice=[2 3 6 7] length=4 capacity=6

func

main()

slice := arr[1:

3:5]

// max不能大於陣列長度

printsliceinfo

(slice)

slice =

(slice,6)

printsliceinfo

(slice)

slice =

(slice,7)

printsliceinfo

(slice)

}// current slice=[2 3] length=2 capacity=4

// current slice=[2 3 6] length=3 capacity=4

// current slice=[2 3 6 7] length=4 capacity=4

比較不同的max值下,capacity的值有何變化。

slice擴容機制

slice如何擴容的呢?

切片也可以做為函式引數,語法類似於陣列傳遞不指明陣列大小。

例項:

package main

import

("fmt"

)func

sumpartial

(s [

]int

)int

return res

}func

main()

slice := arr[1:

3]fmt.

printf

("sum of element 1 to 3 is: %d"

,sumpartial

(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...

Go語言14 切片 Slice

go 語言切片是對陣列的抽象。go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。你可以宣告乙個未指定大小的陣列來定義切片 var identifier typ...