Karte [Schlüssel] löschen in go?

166

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 funktioniert.


Update (November 2011):

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

Go 1 entfernt die spezielle Kartenzuweisung und führt eine neue integrierte Funktion ein delete: delete(m, x)löscht den vom Ausdruck abgerufenen Karteneintrag m[x]. ...

Jonaz
quelle

Antworten:

153

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, die Existenz zu überprü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");
    }
}
coolaj86
quelle
Den Wert sessions["moo"] = sessions["moo"], false;
nachzuschlagen und wiederzuverwenden
Das stürzt ab, wenn der Schlüssel nicht vorhanden ist. Ich habe eine weitere Lösung hinzugefügt, die auf Ihrer Idee basiert.
1
Ist dies sicher zu verwenden, während die Karte selbst entfernt wird?
Jorge Ramirez
@ GeorgeRamirez Ich glaube nicht. Wenn Sie dies tun möchten, finden Sie einen Weg, um über ein Stück der Schlüssel anstelle des Kartenobjekts selbst zu iterieren
Seaux
5
Warum nutzt die zweite Lösung Ressourcen besser? In der zweiten Lösung führen Sie zwei Schlüsselsuchen durch, während Sie in der ersten Lösung eine Schlüsselsuche durchführen.
Thebiggestlebowski
86

Von Go 1- Versionshinweisen kopiert

In der alten Sprache schrieb man die Anweisung, um den Eintrag mit dem Schlüssel kvon der durch dargestellten Karte zu löschen m:

m[k] = value, false

Diese Syntax war ein besonderer Sonderfall, die einzige Zwei-zu-Eins-Zuordnung. Es war erforderlich, einen Wert (normalerweise ignoriert) 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 eingebaute Funktion delete. Der Anruf

delete(m, k)

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

Aktualisierung: Laufen go fixwerden Ausdrücke der Form umwandeln m[k] = value, falsein delete(m, k)wenn es klar ist , dass der Wert ignoriert sicher aus dem Programm und entsorgt werden , falseauf die vordefinierte Boolesche Konstante bezeichnet. Das Fix-Tool kennzeichnet andere Verwendungen der Syntax zur Überprüfung durch den Programmierer.

hannson
quelle
54

Von Anfang an :

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

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
quelle
sessions.go:6: cannot use 0 (type int) as type chan int
3
@Kinopiko: Ich glaube nicht, dass Jurily für das OP gedacht hat, um dieses Code-Snippet zu verwenden. Er hat gerade ein Beispiel aus den Dokumenten kopiert.
Jesaja
2
Sieht so aus, als ob dies seitdem entfernt wurde undassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Verwenden Sie make (chan int)anstelle von nil. Der erste Wert muss derselbe 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
}

UPDATE: Meine Antwort wurde korrigiert.

Jesaja
quelle
sessions.go:6: cannot use 0 (type int) as type chan int
Hoppla, ich habe vergessen, dass ich das auch entfernt habe: P
Jesaja
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
Das obige kompiliert und läuft auf meiner Version von Go.