範囲ループ内でマップから選択したキーを削除しても安全ですか? 質問する

範囲ループ内でマップから選択したキーを削除しても安全ですか? 質問する

選択したキーをマップから削除するにはどうすればよいでしょうか?delete()以下のコードのように、範囲と組み合わせても安全ですか?

package main

import "fmt"

type Info struct {
    value string
}

func main() {
    table := make(map[string]*Info)

    for i := 0; i < 10; i++ {
        str := fmt.Sprintf("%v", i)
        table[str] = &Info{str}
    }

    for key, value := range table {
        fmt.Printf("deleting %v=>%v\n", key, value.value)
        delete(table, key)
    }
}

https://play.golang.org/p/u1vufvEjSw

ベストアンサー1

これは安全です! Effective Goにも同様のサンプルがあります:

for key := range m {
    if key.expired() {
        delete(m, key)
    }
}

言語仕様:

マップ上の反復順序は指定されておらず、反復ごとに同じになることは保証されていません。反復中にまだ到達していないマップ エントリが削除された場合、対応する反復値は生成されません。反復中にマップ エントリが作成された場合、そのエントリは反復中に生成されるか、スキップされる可能性があります。選択は、作成されるエントリごとに、また反復ごとに異なる場合があります。マップが nil の場合、反復回数は 0 です。

おすすめ記事