为什么我需要一个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。