Come cancellare una mappa in Go?


86

Sto cercando qualcosa come la funzione c ++ .clear() per il tipo primitivo map.

O devo semplicemente creare una nuova mappa?

Aggiornamento: grazie per le vostre risposte. Guardando le risposte mi sono appena reso conto che a volte la creazione di una nuova mappa può portare a qualche incongruenza che non vogliamo. Considera il seguente esempio:

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"])
}

Voglio dire, questo è ancora diverso dalla .clear()funzione in c ++, che cancellerà il contenuto nell'oggetto.



1
c'è anche una discussione
sull'eliminazione incorporata

Risposte:


110

Probabilmente dovresti semplicemente creare una nuova mappa. Non c'è alcun motivo reale per preoccuparsi di provare a cancellarne uno esistente, a meno che la stessa mappa non venga indicata da più parti di codice e una parte debba esplicitamente cancellare i valori in modo che questa modifica sia visibile alle altre parti di codice.

Quindi sì, probabilmente dovresti solo dire

mymap = make(map[keytype]valtype)

Se hai davvero bisogno di cancellare la mappa esistente per qualsiasi motivo, questo è abbastanza semplice:

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

1
Quindi eliminare gli elementi uno per uno è l'unico modo per farlo?
lavin

@lavin: Sì. Non esiste una funzione incorporata per farlo e non puoi avere una funzione di libreria che lo faccia per mappe arbitrarie. Ma sono comunque solo 3 righe.
Lily Ballard

6
Va davvero bene modificare il contenuto di una mappa mentre iterando tutti i valori? Altre lingue non funzioneranno correttamente con questo.
John Jeffery

5
@ JohnJeffery: l'ho provato prima di pubblicarlo. Sembra funzionare. La lingua effettiva delle specifiche dice che The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. If map entries that have not yet been reached are deleted during iteration, the corresponding iteration values will not be produced. If map entries are inserted during iteration, the behavior is implementation-dependent, but the iteration values for each entry will be produced at most once. If the map is nil, the number of iterations is 0.questo suggerisce che è supportata.
Lily Ballard

18
A partire dalla versione 1.11, le operazioni di cancellazione della mappa di questo modulo sono ottimizzate dal compilatore. github.com/golang/go/blob/master/doc/go1.11.html
Benjamin B.

21

A differenza di C ++, Go è un linguaggio per la raccolta dei rifiuti. Devi pensare le cose in modo un po 'diverso.

Quando crei una nuova mappa

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

la mappa originale verrà eventualmente raccolta dai rifiuti; non è necessario cancellarlo manualmente. Ma ricorda che le mappe (e le sezioni) sono tipi di riferimento; li crei con make(). La mappa sottostante verrà raccolta in Garbage Collection solo quando non ci sono riferimenti ad essa. Quindi, quando lo fai

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

l'array originale non sarà sottoposto a garbage collection (fino a quando b non viene sottoposto a garbage collection oppure b si riferisce a qualcos'altro).


3
// 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{}

-5

Se stai provando a farlo in un ciclo, puoi sfruttare l'inizializzazione per cancellare la mappa per te. Per esempio:

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")
}

Quando lo esegui, cancella la mappa precedente e inizia con una mappa vuota. Ciò è verificato dall'output:

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

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

3
Ciò non significa cancellare la mappa, ma creare una nuova mappa e associarla a una variabile locale con lo stesso nome ad ogni ciclo.
Delaney
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.