Как очистить карту в Go?
Я ищу что-то вроде функции С++ .clear()
для примитивного типа map
.
Или мне просто нужно создать новую карту?
Обновление: Спасибо за ваши ответы. Рассматривая ответы, я просто понял, что иногда создание новой карты может привести к некоторой несогласованности, которую мы не хотим. Рассмотрим следующий пример:
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"])
}
Я имею в виду, что это все еще отличается от функции .clear()
в С++, которая очищает содержимое объекта.
Ответы
Ответ 1
Вероятно, вы должны просто создать новую карту. Нет никакой реальной причины пытаться очистить существующую, если на одну и ту же карту не ссылаются несколько фрагментов кода, и одна часть явно должна очищать значения, чтобы это изменение было видимым для других фрагментов кода.
Итак, вы должны просто сказать
mymap = make(map[keytype]valtype)
Если вам действительно нужно очистить существующую карту по любой причине, это достаточно просто:
for k := range m {
delete(m, k)
}
Ответ 2
В отличие от С++, Go - это сборник мусора. Вам нужно поразмышлять над чем-то другим.
Когда вы создаете новую карту
a := map[string]string{"hello": "world"}
a = make(map[string]string)
исходная карта будет собрана в мусор; вам не нужно очищать его вручную. Но помните, что карты (и срезы) являются ссылочными типами; вы создаете их с помощью make()
. Основная карта будет собираться с мусором только тогда, когда на ней нет ссылок.
Таким образом, когда вы делаете
a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)
исходный массив не будет собираться с мусором (пока b не будет собрано мусор или b относится к чему-то еще).
Ответ 3
Значение неинициализированной карты равно нулю.
map = nil;
Должен сделать. Тогда, конечно, вам нужно создать новую карту.
Ответ 4
Если вы пытаетесь сделать это в цикле, вы можете воспользоваться инициализацией, чтобы очистить карту для вас. Например:
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")
}
Когда вы выполняете это, он очищает предыдущую карту и начинается с пустой карты. Это подтверждается выходом:
$ go run maptests.go
For map instance 0
cat Patches
-----------
For map instance 1
dog Spot
-----------