web-dev-qa-db-ja.com

移動中にマップ[キー]を削除しますか?

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

_var sessions =  map[string] chan int{}
_

_sessions[key]_を削除するにはどうすればよいですか?私は試した:

_sessions[key] = nil,false;
_

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


更新(2011年11月):

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

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

108
jonaz

奇妙なことに、

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");
    }
}
96
user181548

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

古い言語では、マップkからキーkを持つエントリを削除するために、ステートメントを書きました。

_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は事前定義されたブール定数を参照します。修正ツールは、プログラマーによる検査のために、構文の他の用途にフラグを立てます。

69
hannson

From Effective Go

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

delete(timeZone, "PDT");  // Now on Standard Time
31
delete(sessions, "anykey")

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

17
Moshe Revah

nilの代わりにmake (chan int)を使用します。最初の値は、マップが保持するタイプと同じでなければなりません。

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

PDATE:私の答えを修正しました。

0
Alvin Row