Golangの理解: 配列 vs. スライス
Ethan Miller
Product Engineer · Leapcell

Key Takeaways
- Goの配列は固定サイズですが、スライスは動的で柔軟です。
- スライスは参照型であり、配列よりもメモリ効率が高くなります。
- スライスはデータをコピーせずに強力なデータ操作機能を提供します。
Goでは、配列とスライスは要素のシーケンスを格納するために使用される基本的なデータ構造です。これらは似ているように見えるかもしれませんが、開発者が理解するために重要な明確な特性と動作があります。
Goの配列
Goの配列は、同じ型の要素の固定サイズのシーケンスです。配列が宣言されると、そのサイズは変更できません。配列を宣言するための構文には、そのサイズの指定が含まれます。
var arr [5]int
この例では、arr
は5つの整数の配列です。配列はGoの値型であり、ある配列を別の配列に割り当てると、そのすべての要素がコピーされます。同様に、配列を関数に渡すと、配列全体がコピーされます。この動作は、特に大きな配列の場合、パフォーマンスに影響を与える可能性があります。
Goのスライス
スライスは、基になる配列へのウィンドウを提供する、より柔軟で動的なデータ構造です。スライスは参照するデータを所有しません。代わりに、配列のセグメントを記述します。スライスを宣言するための構文は次のとおりです。
var s []int
スライスには3つのコンポーネントがあります。
- ポインタ: 基になる配列のアドレスを参照します。
- 長さ: スライス内の要素の数。
- 容量: スライスの最初の要素から始まる、基になる配列内の要素の数。
配列とは異なり、スライスは参照型です。あるスライスを別のスライスに割り当てるか、スライスを関数に渡しても、基になるデータはコピーされません。両方のスライスが同じ配列セグメントを参照します。この動作により、スライスは動的なデータ操作に対してより効率的で汎用性が高くなります。
スライスの作成
スライスは、いくつかの方法で作成できます。
-
既存の配列またはスライスから:
a := [5]int{1, 2, 3, 4, 5} s := a[1:4] // s == []int{2, 3, 4}
-
make
関数を使用:s := make([]int, 5, 10)
これにより、長さ5、容量10のスライスが作成されます。
-
スライスリテラル:
s := []int{1, 2, 3}
これにより、長さ3、容量3のスライスが作成されます。
配列とスライスの違い
-
サイズ: 配列はコンパイル時に定義された固定サイズを持ちますが、スライスは動的であり、必要に応じて拡大または縮小できます。
-
型: 配列のサイズはその型の一部であり(
[3]int
は[4]int
とは異なります)、配列の柔軟性が低下します。ただし、スライスにはサイズが型に含まれていないため、柔軟性が向上します。 -
メモリ効率: スライスは参照型であるため、関数に渡されるときにメモリ効率が高くなります。スライス記述子(ポインタ、長さ、容量)のみが渡され、データ全体は渡されません。
-
ユースケース: 配列は、要素の数がわかっていて固定されている場合に適しています。スライスは、要素の数が動的または不明な場合に適しており、より柔軟性と機能を提供します。
スライスの内部メカニズム
効率的なGoプログラミングには、スライスの内部メカニズムを理解することが不可欠です。スライスは、基になる配列へのポインタ、その長さ、およびその容量を含む記述子です。スライスが配列から作成されると、その配列のセグメントを参照します。
a := [5]int{1, 2, 3, 4, 5} s := a[1:4]
ここで、s
は配列a
の要素{2, 3, 4}
を参照します。 s
を変更すると、同じ基になるデータを共有するため、a
に影響します。 s
の容量を超えた場合(たとえば、append
を使用)、新しい基になる配列が割り当てられ、元の配列は変更されません。
結論
配列とスライスは、Goのデータ処理機能の基礎です。配列は要素の単純な固定サイズのコレクションを提供し、スライスは配列への動的で柔軟なビューを提供し、データをコピーするオーバーヘッドなしで強力なデータ操作を可能にします。それらの違いと適切なユースケースを理解することは、効率的で効果的なGoプログラムを作成するために不可欠です。
FAQs
スライスは、動的なサイズ変更、より優れたメモリ効率、および強化された機能を提供します。
いいえ、スライスは参照型であるため、同じ基になる配列を共有します。
新しい基になる配列が割り当てられ、スライスは新しいメモリを指します。
Leapcellは、Goプロジェクトをホストするための最良の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発。
無制限のプロジェクトを無料でデプロイ
- 使用量のみを支払い — リクエストも料金もなし。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:$25で、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察を得るためのリアルタイムメトリクスとロギング。
簡単なスケーラビリティと高パフォーマンス
- 高い同時実行性を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください!
Xでフォローしてください: @LeapcellHQ