0

这是一个示例代码,它创建一个具有布尔值的字符串键映射。

myMap := make(map[string]bool)

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

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

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

myMap = make(map[string]bool)
4

1 回答 1

1

Golang垃圾回收常见问题解答:

只要有对它的引用,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)

游乐场示例

于 2018-05-14T05:17:23.210 回答