PHPでいうarray、Pythonでいうlist、C++でいうvectorはGolangではスライスです。
この記事では、スライスの宣言、初期化、要素の追加・変更・取得・削除、コピーの方法を紹介します。
効率よくスライスを操作するテクニックも紹介しているので、この記事を読めばスライスを使いこなせます。
宣言
スライスは以下のコードで宣言できます。
ゼロ値
スライスのゼロ値は nil
です。
初期化
初期化について説明する前に、len と cap について説明します。
len はスライスの持つ要素の個数です。len(v)
関数で取得できます。
cap はスライスの容量、つまり確保したメモリです。cap(v)
関数で取得できます。
スライスの初期化は2通りあります。
以下のコードをご覧ください。
s1, s2 は []T{v1, v2, v3...}
という方法で初期化しています。
この方法では、cap が要素数と同一になります。
また、要素数が0の場合でもスライスは nil ではありません。
s3 は make(T, len[, cap])
関数で初期化しています。
cap 引数はオプションであり、指定しない場合、len と同値になります。
要素の追加
append(slice, v)
関数で要素を追加することができます。
cap が足りていない場合はスライスのメモリを再確保してから追加します。
繰り返し要素を追加する
通常
これまでの知識を使うと、このように記述することになると思います。
要素数が分かっている場合
しかし、要素数が分かっている場合は make 関数を用いることで、スライスのメモリの再確保と要素のメモリの確保をせずに要素を追加することができます。
最大の要素数が分かっている場合
最大の要素数は分かっていて追加される要素数は不明である場合、cap のみを指定することでスライスのメモリの再確保をせずに要素を追加することができます。
この場合、要素のメモリの確保が必要となるため速度が低下しますが、最初に挙げた方法と比較すれば高いパフォーマンスで要素を追加することができます。
要素の取得
要素の取得は s[i]
で行えます。
要素の変更
要素の変更は s[i] = v
で行えます。
スライスのコピー
スライスのシャローコピーは代入で行えます。
スライスのディープコピーは copy(s1, s2)
で行えます。