配列の特徴
-
定義の書き方
1次元配列:var a [5]int{0, 1, 2, 3, 4}
2次元配列:var a [2][2]int{ []int{0, 1}, []int{2, 3} }
-
定義した時点で、中身は自動的に0で初期化されている
-
配列変数は配列全体を示す(×先頭の配列要素)
スライスの特徴
-
定義の書き方:
var a []int{0, 1, 2, 3, 4}
←長さなし -
b := a[1:4]
のように再スライスできる(aが配列でも同様にスライス可能) -
再スライスされた要素を変更すると
b[1] = 50
、元のスライス(配列)の要素もa = [0 1 **50** 3 4]
のように変更される
スライスの長さ(length)と容量(capacity)
-
長さ:含まれる要素数
- スライスaの長さを求める ⇒
len(a) = 5
- ex )
len(a[:3]) = 3
,len(a[2:]) = 3
- スライスaの長さを求める ⇒
-
容量:スライスの先頭から元の配列(スライス)の末尾までの要素数
-
スライスxの容量を求める ⇒
cap(x) = 5
-
ex1 )
cap(a[:3]) = 5
"スライスの先頭=元々の先頭" なら容量は元の配列と同じ -
ex2 )
cap(a[2:]) = 3
"スライスの先頭≠元々の先頭"
-
-
必ず(長さ) ≦ (容量) ⇒ スライスを拡張したいときは容量を大きくする
make関数でスライスをつくる
-
a := make([]int, 5)
:長さ5のスライス
b := make([]int, 2, 5)
:長さ2、容量5のスライス(長さは0にしてもOK) -
スライス元の配列要素はすべて0 ⇒ スライスの要素もすべて0
a = [0 0 0 0 0]
b = [0 0]
append関数でスライスに要素を追加する
-
長さ0、容量0のスライスaに要素を追加
a = append(a, 0, 1, 2)
:長さ3、容量4のスライス -
要素を追加するとき元の配列の容量が小さい場合は、より大きいサイズの配列を割り当て直す