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が確かに呼ばれているのを確認した