Голанг де-ссылки на карту
Вот пример кода, который создает карту строковых ключей, имеющих значение bool.
myMap := make(map[string]bool)
myMap["Jan"] = true
myMap["Feb"] = false
myMap["Mar"] = true
Сделав некоторые операции на этой карте, я хочу удалить ее. Я не хочу использовать цикл для итерации каждого ключа и удаления.
Если я снова произвожу инициализацию myMap (как показано ниже), отменяет ли он ссылку на оригинал и подлежит ли сборке мусора?
myMap = make(map[string]bool)
1 ответ
Golang FAQ по сбору мусора:
Каждая переменная в Go существует до тех пор, пока есть ссылки на нее. Если компилятор не может доказать, что на переменную не ссылаются после возврата из функции, то компилятор должен выделить переменную в куче для сбора мусора, чтобы избежать ошибок висячих указателей.
Если для текущей карты нет ссылок, то это будет сборщик мусора языком. Но для удаления карты Нет никакого другого процесса, кроме зацикливания и удаления ключей по одному. как
myMap := make(map[string]bool)
for k, _ := range myMap{
delete(myMap, k)
}
Если вы заново инициализируете карту, используя make
он не будет разыменовывать то же самое, что очистит карту, но не разыменует ее. Если вы проверите его длина, он станет 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)