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の伸長が行われることを確認できた。

関連