選択したキーをマップから削除するにはどうすればよいでしょうか?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)
}
}
ベストアンサー1
これは安全です! Effective Goにも同様のサンプルがあります:
for key := range m {
if key.expired() {
delete(m, key)
}
}
言語仕様:
マップ上の反復順序は指定されておらず、反復ごとに同じになることは保証されていません。反復中にまだ到達していないマップ エントリが削除された場合、対応する反復値は生成されません。反復中にマップ エントリが作成された場合、そのエントリは反復中に生成されるか、スキップされる可能性があります。選択は、作成されるエントリごとに、また反復ごとに異なる場合があります。マップが nil の場合、反復回数は 0 です。