Go言語における配列(Array)は、同一データ型の要素を連続したメモリ領域に格納する複合型です。宣言時点で要素数(長さ)が固定され、実行中に長さを拡張したり型を変更したりすることはできません。個々のデータは要素(Element)と呼ばれ、ゼロベースのインデックスでアクセスします。
宣言と初期化のパターン
標準的な宣言構文は var 変数名 [要素数]型 です。用途に応じた初期化方法を以下に示します。
変数宣言と個別代入
package main
import "fmt"
func main() {
// 宣言のみでメモリを確保。整数型はデフォルト値 0 で初期化される
var scores [3]int
scores[0] = 85
scores[1] = 92
scores[2] = 78
fmt.Println(scores) // [85 92 78]
}
宣言と同時初期化
package main
import "fmt"
func main() {
// 要素数、型、初期値を一度に指定
scores := [3]int{85, 92, 78}
fmt.Println(scores)
}
インデックス指定による初期化
package main
import "fmt"
func main() {
// キー(インデックス)を明示することで、順序を入れ替えて定義できる
members := [3]string{0: "Yamada", 2: "Sato", 1: "Suzuki"}
fmt.Println(members) // [Yamada Suzuki Sato]
}
要素数省略(自動算出)
package main
import "fmt"
func main() {
// 長さの部分を `...` に置き換えると、コンパイラが初期化リストの要素数から自動判定する
items := [...]string{"Apple", "Banana", "Cherry"}
fmt.Println(items)
}
基本操作と反復処理
配列に対する一般的な操作は、組み込み関数や演算子を活用して実装します。
長さの取得と要素アクセス
package main
import "fmt"
func main() {
dataset := [5]int{10, 20, 30, 40, 50}
fmt.Println("Length:", len(dataset))
fmt.Println("First:", dataset[0])
}
スライス変換
配列の一部を切り出すにはスライス構文 [開始:終了] を使用します。範囲は左側は含まれ、右側は含まれません。
package main
import "fmt"
func main() {
data := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(data[2:]) // 3番目以降: [3 4 5 6 7 8 9]
fmt.Println(data[:2]) // 0番目から2番目未満: [1 2]
}
ループ処理
package main
import "fmt"
func main() {
cities := [...]string{"Tokyo", "Osaka", "Nagoya"}
// インデックスを利用した従来の for ループ
for i := 0; i < len(cities); i++ {
fmt.Printf("%d: %s\n", i, cities[i])
}
// range によるインデックスと値の同時取得
for idx, city := range cities {
fmt.Printf("Index: %d, Value: %s\n", idx, city)
}
}
多次元配列
配列の要素自体が配列である構造を多次元配列と呼びます。二次元配列の定義例を示します。
二次元配列の初期化
package main
import "fmt"
func main() {
// 2行3列の文字列型配列。各次元の初期化リストは波括弧で囲む
grid := [2][3]string{
{"A1", "A2", "A3"},
{"B1", "B2", "B3"},
}
fmt.Println(grid)
}
自動長判定の使用制限
多次元配列において、コンパイラによる長さの自動判定(...)は最外側(最初の次元)でのみ許可されます。内部の次元は必ず明示的な数値で定義する必要があります。
package main
import "fmt"
func main() {
// 最初の次元のみ `...` を使用可能。内部の `[2]` は固定値でなければならない
matrix := [...][2]int{{1, 2}, {3, 4}, {5, 6}}
fmt.Println(matrix)
}