1. ホーム
  2. dictionary

[解決済み] 範囲ループ内で選択されたキーをmapから削除しても安全ですか?

2022-04-21 09:19:03

質問

マップから選択したキーを削除するにはどうすればよいですか? また delete() は、以下のコードのように、range と共に使用されるのでしょうか?

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

解決方法は?

これは安全です また、同様のサンプルは 効果的な囲碁 :

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

そして 言語仕様 :

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