Go言語100Tips ありがちなミスを把握し、実装を最適化する の No.30 〜 No.31 まで読んだ。
ここから第4章 制御構造
No.30 は、rangeループで要素がコピーされることについて。
前の章に出てきたスライスを扱うときに、一緒に必ず出てくるのが rangeループだ。スライスの要素を一つずつ取り出して処理する場合にとても便利だ。取り出された要素は、スライスの要素のコピーなので、これに変更を与えても、元のスライスの中身は変わらない。
スライスがポインタのスライスであれば、参照先を変更することができる。しかし、「これは予測可能性(predictability)にかけるため、CPUにとって効率が悪くなるかもしれない」と書かれている。ここで言う予測可能性に欠ける、とは、ポインタを用いることで、メモリアクセスのパターンが予測しにくくなり、効率が悪くなることと思われる。
つい、便利だからとポインタ使いたくなるが、使い所は注意しなければならない。
No.31 は、rangeの式の評価について。ループ処理ではループをいつまで続けるかは、式で評価されるが、rangeの場合は 「range」の右側のやつが式になる。この式は、range ループが始まる最初に一度だけ評価される。つまり、ループ処理中に式に指定したスライスに要素が追加されても、最初の数だけループ処理が行われることを意味している。
この辺り、雰囲気で理解していた気分になっていたな。