这是一个示例代码,它创建一个具有布尔值的字符串键映射。
myMap := make(map[string]bool)
myMap["Jan"] = true
myMap["Feb"] = false
myMap["Mar"] = true
在这张地图上做了一些操作后,我想删除它。我不想使用 for 循环遍历每个键并删除。
如果我确实再次重新初始化 myMap(如下所示),它是否会取消引用原始文件并进行垃圾收集?
myMap = make(map[string]bool)
这是一个示例代码,它创建一个具有布尔值的字符串键映射。
myMap := make(map[string]bool)
myMap["Jan"] = true
myMap["Feb"] = false
myMap["Mar"] = true
在这张地图上做了一些操作后,我想删除它。我不想使用 for 循环遍历每个键并删除。
如果我确实再次重新初始化 myMap(如下所示),它是否会取消引用原始文件并进行垃圾收集?
myMap = make(map[string]bool)
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)