这是创建具有bool值的字符串键映射的示例代码。

myMap := make(map[string]bool)

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

在此 map 上执行一些操作后,我要删除它。我不想使用for循环来遍历每个键并删除。

如果我再次重新初始化myMap(如下所示),它是否会取消引用原始 map 并进行垃圾回收?
myMap = make(map[string]bool)

最佳答案

Golang FAQ关于垃圾回收:

只要有引用,Go中的每个变量都存在。如果
编译器无法证明之后没有引用该变量
函数返回,则编译器必须在
垃圾回收堆,以避免悬空的指针错误。

如果当前 map 没有使用任何引用,则该语言将对其进行垃圾收集。但是对于删除 map ,除了循环遍历并逐个删除键外,没有其他处理。如

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

如果使用make重新初始化 map ,它将不会取消引用相同,它将清除 map 但不会取消引用。如果检查其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

07-27 17:56