golang取消参考地图

时间:2018-05-14 04:34:11

标签: go garbage-collection go-map

下面是一个示例代码,用于创建值为bool的字符串键映射。

myMap := make(map[string]bool)

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

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

如果我再次重新初始化myMap(如下所示),它是否取消引用原始内容并进行垃圾收集?

myMap = make(map[string]bool)

1 个答案:

答案 0 :(得分:0)

关于垃圾收集的

Golang FAQ

  

只要有对它的引用,Go中的每个变量都存在。如果   编译器无法证明变量未被引用   函数返回,然后编译器必须分配变量   垃圾收集堆,以避免悬空指针错误。

如果没有用于当前地图的引用,它将被语言垃圾收集。但是对于删除地图除了循环之外没有其他进程并且逐个删除密钥。如

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