Подтвердить что ты не робот

Как очистить карту в 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() в С++, которая очищает содержимое объекта.

4b9b3361

Ответ 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 относится к чему-то еще).

Ответ 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
-----------