golang 個人筆記和心得

slice

相對於 array, slice 提供了彈性, 不需要指定大小

是由三個元件組成

  1. ptr
  2. len
  3. cap

其中 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])
     }
}