KDOC 300: スライスのcapacityが伸長する様子をデバッガで見る
この文書のステータス
- 作成
- 2024-11-19 貴島
- レビュー
- 2024-11-22 貴島
概要
Go言語でスライスが伸長する様子をデバッガで確認する。
func main() { // 要素数0, 容量1 s := make([]string, 0, 1) for i := 0; i < 100; i++ { print("for break") s = append(s, "a") } }
↑このコードは要素数が0、capacityが1なのでループの2回めでcapacityの増加処理が発生するはずである。
Goのデバッガdlvを使って、見る。
$ dlv debug main.go # 初期化処理でのgrowsliceにブレークするので、printまで飛ばす # 組み込み関数printはコンパイル後はprintstringになっている (dlv) b runtime.printstring # 飛ばす (dlv) n # printまで飛ばした時点で仕掛ける (dlv) b runtime.growslice # cap1のスライスなので、ループの最初の1回は引っかからない # ループの2回目ではgrowsliceで止まる
要素数がcapacityを超えた2回目のループでは、growsliceが呼ばれてcapacityの伸長が行われることを確認できた。
関連
- KDOC 299: appendはコンパイルすると消える。growsliceが確かに呼ばれているのを確認した