上一節介紹的陣列在 go 語言中沒那麼常用,更常用的資料結構是切片,即動態陣列,其長度並不固定,我們可以向切片中追加元素,它會在容量不足時自動擴容。
在 go 語言中,切片型別的宣告方式與陣列有一些相似,不過由於切片的長度是動態的,所以宣告時只需要指定切片中的元素型別:
int1.0 切片資料結構inte***ce{}
data 是一片連續的記憶體空間,這片記憶體空間可以用於儲存切片中的全部元素,陣列中的元素只是邏輯上的概念,底層儲存其實都是連續的,所以我們可以將切片理解成一片連續的記憶體空間加上長度與容量的標識。type sliceheader struct
1.1 切片定義
切片:切片是陣列的乙個引用,因此切片是引用型別。但自身是結構體,值拷貝傳遞。
切片的長度可以改變,因此,切片是乙個可變的陣列。
切片遍歷方式和陣列一樣,可以用len()求長度。表示可用元素數量,讀寫操作不能超過該限制。
cap可以求出slice最大擴張容量,不能超出陣列限制。0 <= len(slice) <= len(array),其中array是slice引用的陣列。
切片的定義:var 變數名 型別,比如 var str string var arr int。
如果 slice == nil,那麼 len、cap 結果都等於 0。
go 語言中包含三種初始化切片的方式:
通過下標的方式獲得陣列或者切片的一部分;
使用字面量初始化新的切片;
使用關鍵字 make 建立切片:
arr[0:
3] or slice[0:
3]// 使用下標初始化
slice :=
int// 使用字面量初始化
slice :=
make([
]int,10
)// 使用make關鍵字
建立切片的各種方式:
package main
import
"fmt"
func
main()
else
// 2.:=
s2 :=
int// 3.make()
var s3 [
]int
=make([
]int,0
) fmt.
println
(s1, s2, s3)
// 4.初始化賦值
var s4 [
]int
=make([
]int,0
,0) fmt.
println
(s4)
s5 :=
int fmt.
println
(s5)
// 5.從陣列切片
arr :=[5
]int
var s6 [
]int
// 前包後不包
s6 = arr[1:
4]fmt.
println
(s6)
}
輸出結果:var a =
intfmt.
printf
("slice a : %v\n"
, a)
var b =
intfmt.
printf
("slice b : %v\n"
, b)
c :=
(a, b...
)fmt.
printf
("slice c : %v\n"
, c)
d :=
(c,7
)fmt.
printf
("slice d : %v\n"
, d)
e :=
(d,8,9
,10)fmt.
printf
("slice e : %v\n"
, e)
slice a : [1 2 3]拷貝切片slice b : [4 5 6]
slice c : [1 2 3 4 5 6]
slice d : [1 2 3 4 5 6 7]
slice e : [1 2 3 4 5 6 7 8 9 10]
切片的拷貝雖然不是常見的操作,但是卻是我們學習切片實現原理必須要涉及的。當我們使用 copy(a, b) 的形式對切片進行拷貝。
輸出結果:s1 :=
int fmt.
printf
("slice s1 : %v\n"
, s1)
s2 :=
make([
]int,10
) fmt.
printf
("slice s2 : %v\n"
, s2)
copy
(s2, s1)
fmt.
printf
("copied slice s1 : %v\n"
, s1)
fmt.
printf
("copied slice s2 : %v\n"
, s2)
s3 :=
int fmt.
printf
("slice s3 : %v\n"
, s3)
s3 =
(s3, s2...
) fmt.
printf
(, s3)
s3 =
(s3,4,
5,6)
fmt.
printf
("last slice s3 : %v\n"
, s3)
copy :函式 copy 在兩個 slice 間複製資料,複製長度以 len 小的為準。兩個 slice 可指向同一底層陣列,允許元素區間重疊。
小結:
切片的很多功能都是由執行時實現的,無論是初始化切片,還是對切片進行追加或擴容都需要執行時的支援,需要注意的是在遇到大切片擴容或者複製時可能會發生大規模的記憶體拷貝,一定要減少類似操作避免影響程式的效能。
Go基礎資料結構 陣列Array
陣列和切片是 go 語言中常見的資料結構,很多剛剛使用 go 的開發者往往會混淆這兩個概念。陣列作為最常見的集合在程式語言中是非常重要的,除了陣列之外,go 語言引入了另乙個概念 切片,切片與陣列有一些類似,但是它們的不同導致了使用上的巨大差別。golang array和以往認知的陣列有很大不同 1...
Go語言基礎 切片
切片 slice 是乙個擁有相同型別元素的可變長度的序列。它是基於陣列型別做的一層封裝。它非常靈活,支援自動擴容。切片是乙個引用型別,它的內部結構包含位址 長度和容量。切片一般用於快速地操作一塊資料集合。陣列的長度是固定的並且陣列長度屬於型別的一部分,所以陣列有很多的侷限性。1 func array...
Go基礎之切片
slicetest project main.go package main import fmt func main slice1 arr 3 在現有陣列上建立切片 slice2 make int,5,10 make建立,5為元素個數,10為最大元素個數 可以增加 slice4 int copy ...