Go は append() で内部の配列を拡張する時、必ず現在の配列の 倍の長さ の配列を確保し
とあるが実際に試してみたら必ずしも倍ではなかったので調べた。
(六年前の記事なので、当時は必ず2倍になってたのかもしれない)
【Go】appendで新しく配列が割り当てられる際にどれくらいcapが確保されるか知っていますか? - Qiitaに詳しく解説してある。
↑を見つける前に自力でたどり着いた軌跡
- 検証コード https://gist.github.com/kyanny/57c3c7aeaa451e1513442b97c1cef955
- 最初のうちは2倍だがすぐに1.25倍?くらいに変化していることに気づく
append
の実装を読んでみようとしたが探せず、どこだ?とググる Where is the implementation of func append in Go? - Stack Overflow1.25
で Go のソースコードをag
してみたりしたが、ハズレ
- https://github.com/golang/go/blob/6327e8dc69c47d6355e2623cc491f0140d2563f5/src/cmd/compile/internal/gc/cgen.go#L2748
growslice
というのがお目当てのものと知る- このへんで1.25倍くらいになる理屈がわかる https://github.com/golang/go/blob/go1.14.4/src/runtime/slice.go#L95-L114
- 必ずしも1.25倍で一定なわけでもないのが気になるが、この関数の後半は難しくて読めないので謎解きは諦める
qiita go append
で同じこと書いてる人いないかな?とググって【Go】appendで新しく配列が割り当てられる際にどれくらいcapが確保されるか知っていますか? - Qiitaを見つける- 読むとちゃんと
growslice
の後半処理などまで詳しく解説してあり、ななめ読みして感心する
- 読むとちゃんと