登录
首页 >  Golang >  Go问答

go 通道为什么不会在函数完成后被垃圾回收并关闭

来源:stackoverflow

时间:2024-03-08 15:30:30 310浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《go 通道为什么不会在函数完成后被垃圾回收并关闭》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

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”将超出范围,应该被垃圾收集,但它打开并运行-例程无限期地等待从中接收值, 到底发生了什么??


解决方案


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

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

到这里,我们也就讲完了《go 通道为什么不会在函数完成后被垃圾回收并关闭》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>