配列に対応する型は Slice (スライス) です。スライスは拡大縮小できる動的なシーケンスであり、その機能はより柔軟です。ただし、スライスの動作原理を理解したい場合は、まず配列を理解する必要があります。この節では配列の使い方を中心に説明しますが、Slice(スライス)については「 Go言語のスライス」で説明します。
Go言語での配列の宣言
配列宣言の構文は次のとおりです。
var 配列変数名 [要素数]Type
構文の説明は次のとおりです。
- 配列変数名: 配列を宣言して使用するときの変数名。
- 要素数: 配列内の要素の数。式にすることもできますが、コンパイル時に計算される結果は整数値である必要があり、実行時にのみサイズが確認できる値を要素の数に含めることはできません。
- 型: 配列自体を含む任意の基本型を使用できます。型が配列自体の場合、多次元配列を実現できます。
配列の各要素には、インデックス添字を介してアクセスできます。インデックス添字の範囲は、0 から配列の長さから 1 を引いた位置までです。組み込み関数 len() は、配列内の要素の数を返すことができます。
var a [3]int // 3つの整数の配列を定義します
fmt.Println(a[0]) // 最初の要素を表示する
fmt.Println(a[len(a)-1]) // 最後の要素を表示する
// インデックスと要素を表示する
for i, v := range a {
fmt.Printf("%d %d\n", i, v)
}
// 要素のみを表示する
for _, v := range a {
fmt.Printf("%d\n", v)
}
デフォルトでは、配列の各要素は、要素の型に対応するゼロ値 (数値型の場合は 0) に初期化されます。配列リテラル構文を使用して、値のセットで配列を初期化することもできます。
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
配列の定義において、配列の長さの位置に「…」の省略記号が表示されている場合は、初期化値の数に応じて配列の長さが計算されることを意味します。上記の配列 q は次のように簡略化できます。
q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"
q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"
配列の長さは配列型のコンポーネントであるため、[3]int と [4]int は 2 つの異なる配列型です。配列の長さを決定する必要があるため、配列の長さは定数式である必要があります。編集段階で。
q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // コンパイルエラー:[4]int を [3]int に割り当てることができません
2 つの配列が等しいかどうかを比較します。
2 つの配列が同じ型 (配列の長さと配列内の要素の型を含む) である場合、比較演算子 ( ==
と!=
) を直接使用して、2 つの配列が等しいかどうかを判断できます。 2 つの配列が等しい場合 すべての要素が等しい場合、配列は等しいです。異なる型の 2 つの配列を比較することはできません。そうでない場合、プログラムはコンパイルされません。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // コンパイルエラー:[2]int == [3]intは比較できません。
配列の走査もスライスの走査と似ており、コードは次のとおりです。
var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"
for k, v := range team {
fmt.Println(k, v)
}
コード出力結果:
0 hammer
1 soldier
2 mum
コードの説明は次のとおりです。
- 6 行目では、for ループを使用してチーム配列を走査します。キー k は配列のインデックス、値 v は配列の各要素の値です。
- 7 行目、各キーの値を出力します。