supprimer la carte [clé] en aller?

166

J'ai une carte:

var sessions =  map[string] chan int{}

Comment supprimer sessions[key]? J'ai essayé:

sessions[key] = nil,false;

Cela n'a pas fonctionné.


Mise à jour (novembre 2011):

La syntaxe spéciale de suppression des entrées de carte est supprimée dans Go version 1 :

1 Go va supprimer l'affectation de carte spéciale et d' introduire une nouvelle fonction intégrée, delete: delete(m, x)supprime l'entrée de carte récupérée par l'expression m[x]. ...

Jonaz
la source

Réponses:

154

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 façon est de vérifier l'existence et d'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");
    }
}
coolaj86
la source
Rechercher la valeur et la réutiliser doit être moins chère: sessions["moo"] = sessions["moo"], false;(ou est-ce faux?)
u0b34a0f6ae
Cela se bloque à moins que la clé ne soit présente. J'ai ajouté une autre solution basée sur votre idée.
1
Est-ce sûr à utiliser lors du déplacement de la carte?
Jorge Ramirez
@JorgeRamirez, je ne le crois pas. si vous voulez faire cela, trouvez un moyen d'itérer sur une tranche de clés au lieu de l'objet de la carte lui
Seaux
6
Pourquoi la deuxième solution est-elle une meilleure utilisation des ressources? Dans la deuxième solution, vous effectuez deux recherches clés, tandis que dans la première solution, vous effectuez une recherche clé.
thebiggestlebowski
86

Copié des notes de version de Go 1

Dans l'ancienne langue, pour supprimer l'entrée à clé kde la carte représentée par m, on écrivait la déclaration,

m[k] = value, false

Cette syntaxe était un cas particulier particulier, la seule affectation à deux contre un. Il a fallu passer une valeur (généralement ignorée) qui est évaluée mais ignorée, plus un booléen qui était presque toujours la constante false. Il a fait le travail mais était étrange et un point de discorde.

Dans Go 1, cette syntaxe a disparu; il y a une place nouvelle fonction intégrée, delete. L'appel

delete(m, k)

supprimera l'entrée de mappe récupérée par l'expression m[k]. Il n'y a pas de valeur de retour. La suppression d'une entrée inexistante est un non-op.

Mise à jour: l' exécution go fixconvertira les expressions du formulaire m[k] = value, falseen delete(m, k)lorsqu'il est clair que la valeur ignorée peut être supprimée du programme en toute sécurité et se falseréfère à la constante booléenne prédéfinie. L'outil de correction signalera les autres utilisations de la syntaxe pour inspection par le programmeur.

Hannson
la source
55

De Effective Go :

Pour supprimer une entrée de carte, utilisez la fonction intégrée de suppression, dont les arguments sont la carte et la clé à supprimer. Vous pouvez le faire en toute sécurité même si la clé est déjà absente de la carte.

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
la source
sessions.go:6: cannot use 0 (type int) as type chan int
3
@Kinopiko: Je ne pense pas que Jurily voulait que l'OP utilise cet extrait de code. Il vient de copier un exemple de la documentation.
Isaiah
2
On dirait que cela a été supprimé depuis, obtenantassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Utilisez à la make (chan int)place 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
}

MISE À JOUR: J'ai corrigé ma réponse.

Ésaïe
la source
sessions.go:6: cannot use 0 (type int) as type chan int
Oups, j'ai oublié que j'ai supprimé cela aussi: P
Isaiah
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
Ce qui précède compile et fonctionne sur ma version de Go.