Go言語の配列を使ってみる

Go言語の配列を使ってみます。

まずは固定長配列です。

test1 := [3]int{}
test1[0] = 1
test1[1] = 2
test1[2] = 3

test2 := [3]int{ 1, 2, 3 }

test3 := [...]int{ 1, 2, 3 }

これらはすべて同じもので、固定長配列です。
test1は要素数を宣言して、後から代入しています。
test2は要素数を宣言して初期値を代入しています。要素数と初期値の数が異なるとエラーになります。
test3は要素数は指定せず、初期値を代入して要素数を決定しています。

可変長の配列も使用できます。

test4 := []int{}

test5 := []int{ 1, 2 }
test5[0] = 3

test6 := make([]int, 0, 2)
test7 := append(test6, 3)

可変長配列には要素数と容量があります。
要素数は配列に含まれる要素の数で、容量は配列の最大要素数のようなものです。
test4は要素数も初期値も指定していないため、要素数0、容量0となります。

test5は初期値を指定しているため、初期値の数が要素数、容量となります。
要素数を超えない範囲であれば、test5[0]のようにインデックスでアクセスすることもできます。

test6はmakeを使用して、intの可変長配列を要素数0、容量2で定義しています。
要素を追加するには append を使用します。
他の言語に慣れていると test6.append(3) のようにやりたくなりますが、Go言語ではappendの引数に元の配列を渡すと、要素が追加された配列が戻り値で返されます。
このとき注意したいのは、引数で渡したtest6自体の要素数は増えていないことです。

また、先ほど容量を最大要素数のようなものと言いましたが、
容量を超えて追加することは可能ですが、その場合は容量が倍になります。
例えば以下をみてみます。

test8 := []int{ 1, 2 }
test8 = append(test8, 3)

test9 := make([]int, 2, 3)
test9 = append(test9, 3)

test8では要素数2、容量2の可変長配列に要素を追加していて、要素数が容量を超えます。
このとき容量は倍になるので、要素数3、容量4となります。

一方test9では、要素2、容量3の可変長配列に要素を追加しているので、要素数は容量を超えず、
要素数3、容量3となります。

このくらいの小さな数では気にすることもありませんが、
大きくなってくると容量の倍化はメモリを食うことになるので可変長配列を使用する場合は容量についても考える必要があります。

スポンサーリンク