【发布时间】:2021-06-04 22:29:58
【问题描述】:
package main
import (
"fmt"
)
func main(){
leak()
for{}
}
func leak() {
ch := make(chan int)
go func() {
fmt.Println("i am stuck here")
val := <-ch
fmt.Println("We received a value:", val)
}()
fmt.Println("i have finished my fuction")
}
这里因为我的频道“ch”是在leak()函数中定义的,所以我的理解是在leak函数完成并返回后,“ch”将超出范围,应该被垃圾收集,但它的开放和go-例程无限期地等待从中接收价值, 到底发生了什么??
【问题讨论】:
-
您对 GC 在 Go 中的工作原理的理解是完全错误的。如果无法从任何活动对象访问,则有资格收集东西。范围根本不重要。
-
您无法测试代码中是否“超出范围”,因为根据定义,如果您可以在代码中引用它,则它可以在某个范围内访问。(您还提到了通道的关闭,这不是清理操作,而是特定的频道消息)