Will golang';s仅由goroutine引用的对象的GC空闲内存?

Will golang';s仅由goroutine引用的对象的GC空闲内存?,go,Go,当obj.Do()尚未完成时,GC是否会释放obj的内存?代码将进行计算 m := map[string]*Object { "a": obj } go func(obj *Object) { obj.Do() }(m["a"]) delete(m, "a") 这将给出指针obj,然后obj将被放置在goroutine的新堆栈上,然后goroutine将从该堆栈开始,然后obj将从原始goroutine中的映射中删除。在这一点上,新的goroutine堆栈将有一个指向obj的

obj.Do()
尚未完成时,GC是否会释放
obj
的内存?

代码将进行计算

m := map[string]*Object {
    "a": obj
}
go func(obj *Object) {
    obj.Do()
}(m["a"])

delete(m, "a")

这将给出指针obj,然后obj将被放置在goroutine的新堆栈上,然后goroutine将从该堆栈开始,然后obj将从原始goroutine中的映射中删除。在这一点上,新的goroutine堆栈将有一个指向obj的指针,因此,在第二个goroutine完成执行之前,obj将不会被gc'ed。不,它不会释放任何goroutine可以访问的内存块的内存。如果它收集仍在使用的内存,那将是一个非常糟糕的垃圾收集器。你为什么要问?究竟是什么让你认为垃圾收集器有缺陷?我想他可能担心的是存储在映射中的“obj”,而当计算goroutine start函数的参数时,m[“a”]。如果该表达式没有立即求值,则有可能从映射中删除obj,甚至可能在传递给新goroutine中的匿名函数之前对其进行gc’ed。
m["a"]