golang通道死锁问题,我应该关闭通道

package main

import (
    "fmt"
    "sync"
)

func main(){
    ch1 := make(chan int,100)
    ct := 0
    var wg sync.WaitGroup

    wg.Add(1)
    go func(){
        //defer close(ch1)
        for i:= 0; i < 10;i ++{
            ch1 <- i
        }
    }()

    go func(){
        defer wg.Done()
        for x := range ch1{
            fmt.Println(x)
        }
    }()
    wg.Wait()

    fmt.Println("numbers:",ct)
}

为什么这个代码会返回
fatal error: all goroutines are asleep - deadlock!
我发现如果我关闭通道不会有死锁,但我不知道为什么会这样。将所有项目输入频道后是否必须关闭频道?

回答

for range只有当/当通道关闭时,通道才会终止。如果您不关闭通道并且不向其发送更多值,则该for range语句将永远阻塞,main位于wg.Wait().

“发送方”发送完所有值后应关闭通道,向“接收方”方发出信号,表示通道上将不再有值。

所以是的,你应该关闭频道:

go func() {
    defer close(ch1)
    for i := 0; i < 10; i++ {
        ch1 <- i
    }
}()


以上是golang通道死锁问题,我应该关闭通道的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>