Голанг де-ссылки на карту - PullRequest
0 голосов
/ 14 мая 2018

Вот пример кода, который создает карту строковых ключей со значением bool.

myMap := make(map[string]bool)

myMap["Jan"] = true
myMap["Feb"] = false
myMap["Mar"] = true

После выполнения какой-либо операции на этой карте я хочу удалить ее. Я не хочу использовать цикл for для перебора каждого ключа и удаления.

Если я повторно инициализирую myMap (как показано ниже), отменяет ли он ссылку на оригинал и подлежит ли сборке мусора?

myMap = make(map[string]bool)

1 Ответ

0 голосов
/ 14 мая 2018

Golang FAQ о сборке мусора:

Каждая переменная в Go существует, пока есть ссылки на нее.Если компилятор не может доказать, что на переменную не ссылаются после возврата функции, то компилятор должен выделить переменную в куче для сбора мусора, чтобы избежать ошибок висячих указателей.

В случае отсутствия ссылокиспользуется для текущей карты, это будет мусор, собранный языком.Но для удаления карты Нет никакого другого процесса, кроме зацикливания и удаления ключей по одному.as

myMap := make(map[string]bool)
for k, _ := range myMap{
    delete(myMap, k)
}

Если вы повторно инициализируете карту, используя make, она не будет разыменовывать то же самое, что очистит карту, но не разыменует ее.Если вы проверите для его len, он станет zero

package main

import (
    "fmt"
)

func main() {
    myMap := make(map[string]bool)

    myMap["Jan"] = true
    myMap["Feb"] = false
    myMap["Mar"] = true
    fmt.Println(len(myMap))
    myMap = make(map[string]bool)
    fmt.Println(len(myMap))

}

Наряду с этим, если вы печатаете адрес, он указывает на тот же адрес.

fmt.Printf("address: %p \n", &myMap)
myMap = make(map[string]bool)
fmt.Printf("address: %p ", &myMap)

Пример игровой площадки

...