Slide 32
Slide 32 text
© 2024 ANDPAD All Rights Reserved.
拡張後の登録
bucket := hash & bucketMask(h.B)
if h.growing() {
growWork(t, h, bucket)
}
func growWork(t *maptype, h *hmap, bucket
uintptr) {
// 使用するbucketを移動
evacuate(t, h, bucket&h.oldbucketmask())
// 移動が終わっていないbucketを1つ移動
if h.growing() { evacuate(t, h, h.nevacuate) }
}
32
1. bucketを特定
2. 拡張中の場合データを移動
3. 移動が終わっていないbucketを
1つ移動
https://github.com/golang/go/blob/go1.22.4/src/runtime/map.go#L609-L612
https://github.com/golang/go/blob/go1.22.4/src/runtime/map.go#L1140-L1149