268

私は地図を持っています:

var sessions =  map[string] chan int{}

どうすれば削除できsessions[key]ますか? 私は試した:

sessions[key] = nil,false;

それはうまくいきませんでした。

更新(2011 年 11 月):

マップ エントリを削除するための特別な構文は、Go バージョン 1で削除されました。

Go 1 は、特別なマップ割り当てを削除し、新しい組み込み関数を導入します。delete:delete(m, x)式によって取得されたマップ エントリを削除しますm[x]。...

4

5 に答える 5

266

不思議なことに、

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

うまくいくようです。ただし、これはリソースの使用が不十分なようです。

別の方法は、存在を確認し、値自体を使用することです。

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
于 2009-11-15T01:22:41.767 に答える
105

Go 1リリース ノートからのコピー

古い言語では、 でk表されるマップからkey のエントリを削除するにmは、次のステートメントを書きました。

m[k] = value, false

この構文は、唯一の 2 対 1 の代入という特殊なケースでした。評価されて破棄される値 (通常は無視される) と、ほぼ常に定数 false であるブール値を渡す必要がありました。それは仕事をしましたが、奇妙で論点でした。

Go 1 では、その構文はなくなりました。代わりに、新しい組み込み関数delete. 呼び出し

delete(m, k)

は、式 によって取得されたマップ エントリを削除しますm[k]。戻り値はありません。存在しないエントリの削除はノーオペレーションです。

更新:実行すると、無視された値をプログラムから安全に破棄でき、定義済みのブール定数を参照できることが明らかな場合にgo fix、フォームの式が に変換m[k] = value, falseされます。修正ツールは、プログラマによる検査のために構文の他の使用にフラグを立てます。delete(m, k)false

于 2012-04-24T20:32:49.627 に答える
89

効果的なゴーから:

マップ エントリを削除するには、delete 組み込み関数を使用します。この関数の引数は、削除するマップとキーです。キーがマップに既に存在しない場合でも、これを行うことは安全です。

delete(timeZone, "PDT")  // Now on Standard Time
于 2009-11-14T23:55:39.587 に答える
39
delete(sessions, "anykey")

最近では、何もクラッシュしません。

于 2011-07-05T11:56:55.673 に答える