goでmap [key]を削除しますか?


166

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

var sessions =  map[string] chan int{}

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

sessions[key] = nil,false;

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


アップデート(2011年11月):

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

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

回答:


154

不思議なことに、

package main

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

動作するようです。ただし、これはリソースの使用が不十分なようです!

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

package main

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

値をsessions["moo"] = sessions["moo"], false;
調べて

キーが存在しない場合、クラッシュします。私はあなたのアイデアに基づいて別のソリューションを追加しました。

1
これは、マップ自体を配置するために使用しても安全ですか?
ホルヘラミレス

@JorgeRamirez信じられません。これを行う場合は、マップオブジェクト自体ではなく、キーのスライスを反復処理する方法を見つけます
Seaux

5
なぜ2番目のソリューションはリソースをより有効に利用できるのですか?2番目のソリューションでは2つのキールックアップを行いますが、1番目のソリューションでは1つのキールックアップを行います。
thebiggestlebowski

86

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

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

m[k] = value, false

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

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

delete(m, k)

式によって取得されたマップエントリを削除しますm[k]。戻り値はありません。存在しないエントリを削除しても何も起こりません。

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


54

効果的なGoから:

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

delete(timeZone, "PDT")  // Now on Standard Time

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko:OPがそのコードスニペットを使用することをJurilyが意図したものではないと思います。彼はドキュメントから例をコピーしただけです。
イザヤ

2
これは削除されたようです。取得assignment count mismatch: 1 = 2 (use delete)
ghayes 14年


0

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

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
}

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


sessions.go:6: cannot use 0 (type int) as type chan int

おっと、私もそれを削除したのを忘れていました:P
イザヤ

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

上記は、私のバージョンのGoでコンパイルして実行します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.