web-dev-qa-db-fra.com

supprimer la carte [clé] dans go?

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'expression m[x]. ...

108
jonaz

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");
    }
}
96
user181548

Copié à partir de Go 1 notes de version

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.

69
hannson

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
31
György Andrasek
delete(sessions, "anykey")

Ces jours-ci, rien ne va planter.

17
Moshe Revah

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.

0
Alvin Row