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]
startindex
和endindex
都是可選的,下同。
也可以通過切片來初始化切片:
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...