golang 取消引用地图

golang de-reference a map

这是一个示例代码,它创建了一个值为 bool 的字符串键映射。

myMap := make(map[string]bool)

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

在这张地图上做了一些操作后,我想删除它。我不想使用 for 循环遍历每个键并删除。

如果我再次重新初始化 myMap(如下所示),它会取消引用原始地图并进行垃圾回收吗?

myMap = make(map[string]bool)

Golang FAQ 关于垃圾回收:

Each variable in Go exists as long as there are references to it. If the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors.

如果当前地图没有引用,语言将对其进行垃圾回收。但是对于删除一个map,除了循环遍历,把key一个一个删除,没有其他流程。作为

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)

Playground Example