为什么go通道即使在函数完成后也不被垃圾收集和关闭

  • 本文关键字:通道 go 函数 go channel
  • 更新时间 :
  • 英文 :

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")
}

here since my channel "是在leak()函数内部定义的,所以我的理解是在leak函数完成并返回之后,将超出范围,应该被垃圾收集,但它的开放和go-routine无限期地等待从它接收价值,到底发生了什么?

leak()函数返回之后,仍然有一个引用通道的程序-您在leak()中创建的通道。该例程仍在运行,并且在从通道接收时被阻塞。因为存在引用,所以它不能被垃圾收集。

需要明确的是,垃圾收集不是"它超出了作用域",而是"没有对它的引用"。在这种情况下,仍然有对通道的引用(在派生的gooutine中)

最新更新