这是创建具有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