モジュール 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{...}は、コンパイラーに長さを推測させます。- 値によるコピー(内部関数を含む)。
- 範囲外 = パニック、未定義ではありません。
- 実際には、配列に対するビューである スライス を使用します。