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 Ausdruckm[x]
Abgerufenen Karteneintrag. ...
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");
}
}
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.
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
delete(sessions, "anykey")
In diesen Tagen wird nichts abstürzen.
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.