108 votes

Comment effacer une carte en Go ?

Je cherche quelque chose comme la fonction c++ suivante .clear() pour le type primitif map .

Ou devrais-je plutôt créer une nouvelle carte ?

Mise à jour : Merci pour vos réponses. En regardant les réponses, je viens de réaliser que parfois la création d'une nouvelle carte peut conduire à une certaine incohérence que nous ne voulons pas. Prenons l'exemple suivant :

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

Je veux dire, c'est encore différent de la .clear() en c++, qui effacera le contenu de l'objet.

138voto

Kevin Ballard Points 88866

Vous devriez probablement créer une nouvelle carte. Il n'y a pas vraiment de raison d'essayer d'effacer une carte existante, à moins que la même carte soit référencée par plusieurs morceaux de code et que l'un d'entre eux ait explicitement besoin d'effacer les valeurs de telle sorte que ce changement soit visible pour les autres morceaux de code.

Donc oui, tu devrais probablement juste dire

mymap = make(map[keytype]valtype)

Si vous devez vraiment effacer la carte existante pour une raison quelconque, c'est assez simple :

for k := range m {
    delete(m, k)
}

30voto

John Smith Points 311

Contrairement au C++, le Go est un langage à récupération de données. Vous devez penser les choses un peu différemment.

Lorsque vous créez une nouvelle carte

a := map[string]string{"hello": "world"}
a = make(map[string]string)

la carte d'origine sera éventuellement ramassée ; vous n'avez pas besoin de la nettoyer manuellement. Mais rappelez-vous que les cartes (et les tranches) sont des types de référence ; vous les créez avec la fonction make() . La carte sous-jacente ne sera collectée que lorsqu'il n'y aura pas de références à celle-ci. Ainsi, lorsque vous faites

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

le tableau original ne sera pas ramassé (jusqu'à ce que b soit ramassé ou que b fasse référence à autre chose).

8voto

Sumer Points 598
// Method - I , say book is name of map
for k := range book {
    delete(book, k)
}

// Method - II
book = make(map[string]int)

// Method - III
book = map[string]int{}

2voto

Marco Järvinen Points 466

Le problème de Go pour le générique maps paquet ( https://github.com/golang/go/issues/47649 ) prévoit maps.Clear .

Le paquet se trouve dans golang.org/x/exp/maps (expérimental, non couvert par la garantie de compatibilité)

// Clear removes all entries from m, leaving it empty.
func Clear[M ~map[K]V, K comparable, V any](m M)

Son utilisation

func main() {
    testMap := map[string]int{"gopher": 1, "badger": 2}
    maps.Clear(testMap)
    fmt.Println(testMap)

    testMap["zebra"] = 2000
    fmt.Println(testMap)
}

Exécutez le code ici https://go.dev/play/p/qIdnGrd0CYs?v=gotip

-7voto

leemic Points 1

Si vous essayez de faire cela dans une boucle, vous pouvez profiter de l'initialisation pour vider la carte pour vous. Par exemple :

for i:=0; i<2; i++ {
    animalNames := make(map[string]string)
    switch i {
        case 0:
            animalNames["cat"] = "Patches"
        case 1:
            animalNames["dog"] = "Spot";
    }

    fmt.Println("For map instance", i)
    for key, value := range animalNames {
        fmt.Println(key, value)
    }
    fmt.Println("-----------\n")
}

Lorsque vous l'exécutez, il efface la carte précédente et commence avec une carte vide. Ceci est vérifié par la sortie :

$ go run maptests.go 
For map instance 0
cat Patches
-----------

For map instance 1
dog Spot
-----------

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X