Go言語100Tips ありがちなミスを把握し、実装を最適化する の No.21 〜 No.22 まで読んだ。
スライスの話の続き。
Goがスライスをどのように管理、拡張していくのか、仕組みを知っている必要がある。スライスのサイズが足りなくなった場合、Goは、新しくスライスを追加、追加した方へコピー、追加元はGCによって解放される。組み込み関数の append を使って要素を追加できるのはとても便利だが、内部で行われている処理は意外と無視できない内容だ。
スライスを作成する場合、大きさがわかっている場合は、作成時に容量を指定すること。さらに大なスライスを扱う場合は、長さも指定し、インデックスで参照するとわずかに効率は良くなる。ただし、コードの可読性が失われる場合があるので、使い所はよく考えて。
nilスライスと空スライスの違いについて。
どちらも中は空だが、nilスライスの方は初期化に割り当てを必要としないので、スライスが空の場合は、nilスライスを返すべき。
どの場合も、処理結果は同様になるが、ちょっとした配慮で大きい値を扱った場合にパフォーマンスに差が出てきそうだ。
サービスを運用していくうちに、データが肥大化してきて速度が急激に遅くなる、といった話はよくあるので、最初から行儀良くコードを書いておくことは、とても良い。