Estou procurando algo como a função c ++ .clear()
para o tipo primitivo map
.
Ou devo apenas criar um novo mapa?
Atualização: Obrigado por suas respostas. Olhando para as respostas, acabei de perceber que às vezes a criação de um novo mapa pode levar a alguma inconsistência que não queremos. Considere o seguinte exemplo:
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"])
}
Quer dizer, isso ainda é diferente da .clear()
função em c ++, que limpará o conteúdo do objeto.
Respostas:
Você provavelmente deve apenas criar um novo mapa. Não há nenhum motivo real para se preocupar em tentar limpar um existente, a menos que o mesmo mapa esteja sendo referido por várias partes do código e uma parte precise explicitamente limpar os valores de forma que essa alteração seja visível para as outras partes do código.
Então, sim, você provavelmente deveria apenas dizer
mymap = make(map[keytype]valtype)
Se você realmente precisa limpar o mapa existente por qualquer motivo, isso é bastante simples:
for k := range m { delete(m, k) }
fonte
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.
Isso sugere que é compatível.Ao contrário do C ++, Go é uma linguagem com coleta de lixo. Você precisa pensar as coisas de maneira um pouco diferente.
Quando você faz um novo mapa
a := map[string]string{"hello": "world"} a = make(map[string]string)
o mapa original será eventualmente coletado como lixo; você não precisa limpá-lo manualmente. Mas lembre-se de que os mapas (e fatias) são tipos de referência; você os cria com
make()
. O mapa subjacente será coletado como lixo apenas quando não houver referências a ele. Assim, quando você faza := map[string]string{"hello": "world"} b := a a = make(map[string]string)
o array original não será coletado como lixo (até que b seja coletado como lixo ou b se refira a outra coisa).
fonte
// 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{}
fonte
Se você está tentando fazer isso em um loop, pode aproveitar a inicialização para limpar o mapa para você. Por exemplo:
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 você executa isso, ele limpa o mapa anterior e começa com um mapa vazio. Isso é verificado pela saída:
$ go run maptests.go For map instance 0 cat Patches ----------- For map instance 1 dog Spot -----------
fonte