【问题标题】:why go channel is not garbage collected and closed even after completion of function [closed]为什么即使在功能完成后 go 通道也没有被垃圾收集和关闭[关闭]
【发布时间】: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 中的工作原理的理解是完全错误的。如果无法从任何活动对象访问,则有资格收集东西。范围根本不重要。
  • 您无法测试代码中是否“超出范围”,因为根据定义,如果您可以在代码中引用它,则它可以在某个范围内访问。(您还提到了通道的关闭,这不是清理操作,而是特定的频道消息)

标签: go channel


【解决方案1】:

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

需要明确的是,垃圾收集不是关于“它超出范围”,而是“没有对它的引用”。在这种情况下,仍然有对通道的引用(在生成的 goroutine 中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多