golang 中的悬挂 goroutine

Dangling goroutine in golang

在下面的代码中

  1. goroutine1 发生了什么?(在程序结束时我们有三个没有任何功能的 goroutine goroutine1
  2. 通道会发生什么情况?(当我们在循环中创建一个通道时,它会释放之前的通道内存?关闭它?还是其他?)
func main() {
    for i := 1; i <= 3; i += 1 {
        ch := make(chan int)

        // gorutine1
        go func() {
            time.Sleep(3 * time.Second)
            ch <- i
            fmt.Println("gorutine1 end")
        }()

        // gorutine2
        go func() {
            time.Sleep(1 * time.Second)
            ch <- i+1000
            fmt.Println("gorutine2 end")
        }()

        fmt.Println("loop", <-ch)
    }

    time.Sleep(10 * time.Second)
    fmt.Println("main end")
}

运行 以上代码 here

对于i=1,循环创建两个goroutines,并开始等待从通道读取。 goroutine2 首先写入并终止。通道被读取,然后 i 变为 2。goroutine1 将永远等待,因为没有人会再次从通道读取。您创建一个新频道,然后做同样的事情。当一切都说完了,你有 goroutine1 的三个实例等待写入三个不同的通道。