メインコンテンツにスキップ
モジュール 4 · レッスン 1 / 5コース内の 16/50~8 min
モジュールのレッスン (1/5)

固定長配列

Go では、配列の長さは固定で、型: [N]T に組み込まれています。 これは、アプリケーション コードで直接使用されることはほとんどないプリミティブです。 ほとんどの場合、動的である スライス (次のレッスン) で動作します。 配列に対するビュー。

それでも、配列をよく理解することは不可欠です。Go ではすべてが構築されています。 それらの上に。

宣言と初期化

Go
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3}            // inference with :=
c := [3]int{}                   // all zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4}       // length inferred = 4

配列のゼロ値は、宣言された長さの配列です。 値がゼロの要素:

Go
var nums [5]int  // [0 0 0 0 0]

インデックス作成と len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

範囲外のアクセスは 実行時パニック を引き起こします (サイレント未定義ではありません) C のように)。

長さはタイプの一部です

Go
var a [3]int
var b [4]int
// a = b   // ERROR: different types

[3]int と [4]int は、両方とも成り立ちますが、異なるタイプです。 int。これが、配列が関数に渡されることがほとんどない理由です。 長さをパラメータの型にハードコーディングします。

値によるコピー

スライス (参照) やマップ (参照) とは異なり、配列は ** によってコピーされます。 値**:

Go
a := [3]int{1, 2, 3}
b := a               // copy
b[0] = 99
fmt.Println(a[0])    // 1 — a is unchanged

関数に渡すときも同じことが当てはまります。関数はその関数を受け取ります。 自分のコピー。

配列をいつ使用するか?

  • コンパイル時に既知の固定サイズのバッファー (例: MD5 の [16]byte)。
  • 複合マップキー (スライスは「比較可能」ではありませんが、配列は「比較可能」です)。
  • 優れたパフォーマンス (間接的なものはなく、キャッシュに優しい)。

コードの 99% では、スライスを使用します。

試してみてください

運動#go.m4.l1.e1
試行回数: 0読み込み中…

a を値 10、20、30 を持つ 3 つの int の配列として宣言し、その長さを出力します。

エディターを読み込み中…
ヒントを表示

配列リテラル: `[3]int{a, b, c}`。

3 回の試行後に解決策が利用可能になります

運動#go.m4.l1.e2
試行回数: 0読み込み中…

b を 5 つの整数 (すべてゼロ) の配列として宣言し、位置 2 に 99 を割り当てます。

エディターを読み込み中…
ヒントを表示

`var b [5]int` は [0 0 0 0 0] として始まります。

3 回の試行後に解決策が利用可能になります

Quiz#go.m4.l1.e3
準備完了

[3]int と [4]int は同じ型ですか?

Go
var a [3]int
var b [4]int
// a = b ?
回答の選択肢

要約

  • [N]T: 固定 長さ、タイプの一部。
  • ゼロ値: すべての要素がゼロ値になります。
  • [...]int{...} は、コンパイラーに長さを推測させます。
  • 値によるコピー(内部関数を含む)。
  • 範囲外 = パニック、未定義ではありません。
  • 実際には、配列に対するビューである スライス を使用します。