web-dev-qa-db-de.com

karte löschen [key] in go?

Ich habe eine Karte:

var sessions =  map[string] chan int{}

Wie lösche ich sessions[key]? Ich habe es versucht:

sessions[key] = nil,false;

Das hat nicht geklappt.


Update (November 2011):

Die spezielle Syntax zum Löschen von Karteneinträgen wurde in Go Version 1 entfernt:

Gehe zu 1, um die spezielle Zuordnung zu entfernen und eine neue eingebaute Funktion einzuführen. delete: delete(m, x) löscht den durch den Ausdruck m[x] Abgerufenen Karteneintrag. ...

108
jonaz

Merkwürdigerweise,

package main

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

scheint zu funktionieren. Dies scheint jedoch eine schlechte Ressourcennutzung zu sein!

Eine andere Möglichkeit besteht darin, auf Existenz zu prüfen und den Wert selbst zu verwenden:

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

Kopiert von Go 1 Versionshinweise

In der alten Sprache, um den Eintrag mit der Taste k von der Karte k zu löschen, schrieb man die Anweisung,

m[k] = value, false

Diese Syntax war ein besonderer Sonderfall, die einzige Zwei-zu-Eins-Zuordnung. Es war erforderlich, einen Wert (der normalerweise ignoriert wird) zu übergeben, der ausgewertet, aber verworfen wird, sowie einen Booleschen Wert, der fast immer die Konstante false war. Es hat den Job gemacht, war aber seltsam und ein Streitpunkt.

In Go 1 ist diese Syntax weg; Stattdessen gibt es eine neue integrierte Funktion, delete. Der Anruf

delete(m, k)

löscht den durch den Ausdruck m[k] abgerufenen Karteneintrag. Es gibt keinen Rückgabewert. Das Löschen eines nicht existierenden Eintrags ist ein No-Op.

Aktualisierung: Wenn Sie go fix Ausführen, werden Ausdrücke der Form m[k] = value, false In delete(m, k) konvertiert, wenn dies der Fall ist klar, dass der ignorierte Wert sicher aus dem Programm entfernt werden kann und false auf die vordefinierte Boolesche Konstante verweist. Das Fix-Tool kennzeichnet andere Verwendungen der Syntax zur Überprüfung durch den Programmierer.

69
hannson

Von Effective Go :

Verwenden Sie zum Löschen eines Karteneintrags die integrierte Funktion "Löschen", deren Argumente die Karte und der zu löschende Schlüssel sind. Dies ist auch dann sicher, wenn der Schlüssel auf der Karte bereits fehlt.

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

In diesen Tagen wird nichts abstürzen.

17
Moshe Revah

Verwenden Sie make (chan int) anstelle von nil. Der erste Wert muss vom selben Typ sein, den Ihre Karte enthält.

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: Meine Antwort wurde korrigiert.

0
Alvin Row