【GO】スライスについて深く考える


なんとなく配列代わりに使ったりするスライス。

ちょっと深堀りしてどんなものか考えてみます。

ちゃんと理解すれば中身が変わったり変わらなかったりで混乱することはないはず。

スライスの正体と配列との違い

配列は指定した型を指定した個数入れられる実体。

対してスライスは配列へのポインタを持つ構造体です。

ソースを見るとポインタ、長さ、キャパシティーを持っています。

スライスを代入したときに参照コピーになるのはarrayポインタが代入されるからです(ディープコピーにはcopy(dst, src []Type)が用意されている)。

スライスの定義

部分的なスライスを作る場合は元の配列(スライス)の参照であることに注意。

スライスの追加

append(slice []Type, elems ...Type)で確保領域を追加できる。

キャパシティーを超える追加では別の領域を新たに確保する点に注意。

s1からs2appendするとき、現キャパシティーの倍の10を新規に確保している。

s2からs3appendするときはキャパシティーが足りているので同じ領域に追加。

スライスの検索

for文などで回しながら走査するしかない。

数値でソート済みであればバイナリサーチで多少早くできる。

ただ基本的にインデックス指定できないものはmapにした方が早い。

重複なしで順番に意味がない場合はmapを使うのがベター。

struct{}は0byteなので使っているだけでboolでもなんでもよい)


コメントを残す

メールアドレスが公開されることはありません。