私はこれを読みましslice
たが、反対の利点をまだ十分に認識していませんarray
.だから、SOの誰かがそれよりもよく説明してくれることを期待しています:)
4 に答える
スライスは配列よりも多くの用途があり、そのうちのいくつかは他のポスターで既に言及されています。
- スライスは、ポインターのようにさまざまな方法で操作できます。
- 複数のスライスが同じ基本配列を「指す」ことができます
- スライスは参照によって渡されますが、スライス自体はポインターであるため、配列全体をコピーする必要がないため、より効率的に「配列」を渡すために使用できます。
- ただし、ポインターとは異なり、スライスは追加のバッファーの安全性を提供します。
- スライスのアンダーフローとオーバーフローは、メモリの他の領域にアクセスする危険な機能を許可するのではなく、例外をトリガーします。
- スライスを使用すると、アレイの特定の領域のみへのアクセスを制限できます。これは、サブセットを操作する際に非常に役立ちます。
- コンパイル時にサイズが固定される配列とは異なり、スライスの長さは実行時に動的に決定されます。また、スライスは実行時に動的にサイズ変更できます。
ではgo
、配列は値で渡されます。したがって、「参照渡し」するには、スライスを使用します。それだけではありません!Goのチュートリアルを引用:
配列のサイズはその型の一部です。ただし、スライス変数を宣言して、同じ要素型の任意の配列へのポインタを割り当てることができます。または、より一般的には、a[low : high] の形式のスライス式を指定できます。これは、low から高-1。スライスは配列によく似ていますが、明示的なサイズがなく ([] 対 [10])、基礎となる、多くの場合匿名の通常の配列のセグメントを参照します。複数のスライスが同じ配列の断片を表している場合、複数のスライスでデータを共有できます。複数のアレイでデータを共有することはできません。
Go プログラムでは、スライスは通常の配列よりもはるかに一般的です。それらはより柔軟で、参照セマンティクスを持ち、効率的です。それらに欠けているのは、通常の配列のストレージ レイアウトを正確に制御することです。配列の 100 個の要素を構造内に格納する場合は、通常の配列を使用する必要があります。
配列を関数に渡すときは、ほとんどの場合、仮パラメーターをスライスとして宣言する必要があります。関数を呼び出すときに、配列のアドレスを取得すると、Go は (効率的に) スライス参照を作成して渡します。
スライスと配列については、Go ブログのこの記事でより詳しく説明されていると思います。
すでに与えられた答えに加えて、配列は動的にサイズを変更できませんが、スライスは動的にサイズを変更できます。つまり、配列のサイズを指定するには定数のみを使用できますが、スライスのサイズを指定するには変数を使用できます。