相對於 array, slice 提供了彈性, 不需要指定大小
是由三個元件組成
其中 prt 是指向一個 array 的指標, 如圖所示
len 為實際資料長度, cap 表示容量
宣告的方式為
a := []int
此時的 len , cap 都為 0
你可以用 make 來宣告變數並指定 len 和 cap 的值
a := make([]int,5,10)
其中 5 為len, 10 為 cap
也可以不指定 cap 寫成
a := make([]int,5)
這時 len 為 5 , cap 為 5
另外給定初始值的宣告
var a = []int {1,2,3,4,5}
如果要一個變數指向 a
b := a[2:4]
c := a[:]
其中
b 為 3 , 4.
a[2:4] 的 2 表示指向 a index = 2 的位置, 4 表示為結尾在 index = 4(不包含), 所以則 length 為 2, 另外由於 array 是連續的, 所以 cap = 3
c 為 1,2,3,4,5
[:] 表示 [0:len(a)], 第一個值如果沒寫則為 0, 第二個沒寫的為 len(a) = 5
所以可以得知
a[:3] 和 a[1:] 個別為
1,2,3 //a[:3]
2,3,4,5 //a[1:]
另外要特別注意的是,
b := a[1:3]
並不是 a copy 值給 b, 而是將 b 的指標指向 a ( index 2 ) 的位置
所以這表示如果你改了 b 的值, a 的也會一起改變, 因為他們共用同一個 array.
如果你要兩者是獨立的, 可以使用 copy 的方法
copy(b,c)
這是把 c 的前兩個的值, copy 到 b 中. 為什麼只 copy c 的前兩個?因為 b 的大小只有二, 以小的為主
copy(c,b)
則表示將 b 的值, copy 覆蓋 c 的前兩個值.
另外可以用 append 來增加他的大小
如下所示
import "fmt"
func main(){
var a[]int
a = append(a,1)
a = append(a,2)
for i := range a {
fmt.Println(a[i])
}
}