为什么我需要一个goroutine才能让它工作?

我不是 100% 清楚为什么我的代码不起作用

package main
 
import (
    "fmt"
    "sync"
)
 
//var wg sync.WaitGroup
 
func main() {
 
    c := make(chan int)
    send(c)
    receive(c)
}
 
func send(c chan<- int) {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            for j := 0; j < 10; j++ {
                c <- j
            }
            wg.Done()
        }()
    }
 
    wg.Wait()
    close(c)
}
 
func receive(c <-chan int) {
    for v := range c {
        fmt.Println(v)
    }
}

如果我在发送之前放置 Go,它就可以正常工作。但我认为在发送中等待意味着程序将在那里等待,直到在该函数中创建的 go 例程完成,并且只有在它们全部完成后才会转到接收函数,因此通道被填充?

回答

通道没有缓冲。只有在另一个 goroutine 中从该通道读取时,才会完成对无缓冲通道的写入。因此,在 中创建的所有 goroutinesend都被困在等待写入通道,永远不会到达wg.Done,因此,wg.Wait无限期地等待。当你把 放在send一个单独的 goroutine 中时,receive可以运行,从而从通道中读取,释放等待的 goroutine。


以上是为什么我需要一个goroutine才能让它工作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>