Go言語における配列の定義と操作手法

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)
}

タグ: Go 配列 データ構造 メモリモデル スライス

7月6日 00:21 投稿