J'ai une carte:
var sessions = map[string] chan int{}
Comment puis-je supprimer sessions[key]
? J'ai essayé:
sessions[key] = nil,false;
Ça n'a pas marché.
Mise à jour (novembre 2011):
La syntaxe spéciale pour la suppression des entrées de la carte est supprimée dans Go version 1 :
Go 1 supprimera l'affectation spéciale de la carte et introduira une nouvelle fonction intégrée,
delete
:delete(m, x)
supprimera l'entrée de la carte extraite par l'expressionm[x]
. ...
Curieusement,
package main
func main () {
var sessions = map[string] chan int{};
delete(sessions, "moo");
}
semble fonctionner. Cela semble cependant une mauvaise utilisation des ressources!
Une autre méthode consiste à vérifier l'existence et à utiliser la valeur elle-même:
package main
func main () {
var sessions = map[string] chan int{};
sessions["moo"] = make (chan int);
_, ok := sessions["moo"];
if ok {
delete(sessions, "moo");
}
}
Dans l'ancienne langue, pour supprimer l'entrée avec la clé k
de la carte k
, on a écrit la déclaration,
m[k] = value, false
Cette syntaxe était un cas particulier, la seule affectation deux-à-un. Il fallait transmettre une valeur (généralement ignorée) évaluée mais ignorée, ainsi qu'un booléen presque toujours constant. Il faisait le travail mais était étrange et un point de discorde.
Dans Go 1, cette syntaxe a disparu; à la place, il existe une nouvelle fonction intégrée, delete
. L'appel
delete(m, k)
supprime l'entrée de la carte extraite par l'expression m[k]
. Il n'y a pas de valeur de retour. La suppression d'une entrée inexistante est un no-op.
Mise à jour: Lancer go fix
Convertira les expressions de la forme m[k] = value, false
En delete(m, k)
quand ce sera le cas. Il est clair que la valeur ignorée peut être ignorée du programme en toute sécurité et que false
fait référence à la constante booléenne prédéfinie. L'outil de correction signalera d'autres utilisations de la syntaxe pour l'inspection par le programmeur.
De Effective Go :
Pour supprimer une entrée de carte, utilisez la fonction intégrée delete, dont les arguments sont la carte et la clé à supprimer. Vous pouvez le faire même si la clé est déjà absente de la carte.
delete(timeZone, "PDT"); // Now on Standard Time
delete(sessions, "anykey")
Ces jours-ci, rien ne va planter.
Utilisez make (chan int)
au lieu de nil
. La première valeur doit être du même type que votre carte.
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: Corrigé ma réponse.