Go言語の配列の基本について解説します。
この記事でわかること
- Go言語の配列の基本がわかる
- スライスとの違いがわかる
バージョン
- Go 1.17
定義方法
定義方法は主に2つあります。
var
を使うケースと:=
(省略変数宣言)で説明します。
要素のサイズを指定して定義
var arr1 [5]int
fmt.Printf("%v", arr1)
// 出力結果
[0, 0, 0, 0, 0]
var arr2 = [5]int{}
fmt.Printf("%v", arr2)
// 出力結果
[0, 0, 0, 0, 0]
arr3 := [5]int{1, 2, 3, 4, 5}
fmt.Printf("%v", arr3)
// 出力結果
[1 2 3 4 5]
要素のサイズ指定なしで定義
この場合、与えた初期値が配列のサイズとなります。
var arr4 = [...]int{1, 2, 3, 4, 5}
fmt.Printf("%v", arr4)
// 出力結果
[1 2 3 4 5]
arr5 := [...]int{1, 2, 3, 4, 5}
fmt.Printf("%v", arr5)
// 出力結果
[1 2 3 4 5]
配列の要素の型と初期値
定義の例では、int
型を使っていましたが、要素の型はGoで定義された全ての型を定義できます。
初期値は、それぞれの型の初期値が入ります。
初期値の例
int => 0
string => “”
bool => false
// 例
arr1 := [3]int{} // [0, 0, 0]
arr2 := [3]uint{} // [0, 0, 0]
arr3 := [3]bool{} // [false, false, false]
arr4 := [3]float64{} // [0, 0, 0]
arr5 := [3]string{} // ["", "", ""]
要素へのアクセス
要素へのアクセスは、インデックスを使ってアクセスします。
arr := [5]int{1, 2, 3, 4, 5}
fmt.Printf("%v", arr[0])
// 出力結果
1
インデックスの範囲が間違っているとエラーが発生します。
arr := [5]int{1, 2, 3, 4, 5}
fmt.Printf("%v", arr[5])
// 出力結果
invalid array index 5 (out of bounds for 5-element array)
要素への代入
インデックスで代入したい要素にアクセスして代入します。
arr := [5]int{1, 2, 3, 4, 5}
arr[0] = 6
arr[1] = 7
fmt.Printf("%v", arr)
// 出力結果
[6 7 3 4 5]
注意
配列の型に合わない型の要素を代入しようとすると、エラーが発生します。
配列を配列に代入
配列の要素数と要素の型が一致していれば相互に配列を代入することができます。
重要ポイント
配列は、代入された時にメモリ上では別の領域に分かれたままです。
つまり、代入された側の要素を書き換えても影響がありません。
逆にスライスは、メモリを参照するので代入された側を変更すると、値が書き換わります。
arr1 := [3]int{1, 2, 3}
arr2 := [3]int{4, 5, 6}
arr1 = arr2
fmt.Printf("%v", arr2) // [4, 5, 6]
arr1[0] = 7
arr1[1] = 8
arr1[2] = 9
fmt.Printf("%v", arr1) // [7, 8, 9]
fmt.Printf("%v", arr2) // [4, 5, 6]
配列とスライスの違い
ここまで解説してきた通り、配列の大きな特徴は下記2つです。
- サイズが固定(固定長)
- 値をコピー
スライスは、参照型の1つで配列の特徴の逆になります。
配列よりも柔軟にデータを格納することが可能です。
- サイズが可変(可変長)
- メモリを参照
まとめ
Go言語の配列の基本について解説しました。
特に、配列はスライスと似ている構造なので、違いを理解して使っていくことが重要です。