我正在运行goroutine,它的通道仍然出现错误
package main
import (
"fmt"
"sync"
"time"
)
func foo(c chan int, wg *sync.WaitGroup) {
c <- 45
time.Sleep(time.Second * 4)
c <- 122
wg.Done()
}
func main() {
canal := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
go foo(canal,&wg)
go foo(canal,&wg)
wg.Wait()
for a := range canal {
fmt.Println(a)
}
}
答案 0 :(得分:1)
make(chan int)
创建一个unbuffered channel。这意味着所有发送和接收运算符都将等到另一侧准备就绪。
在goroutine中调用c <- 45
的那一刻,该goroutine将等待,直到有人从频道接收到。但是直到range canal
停留在wg.Wait()
的{{1}}语句之前,没有消费者存在。
因此,您的两个goroutine停留在发送到通道上,而main正在等待goroutine完成后再从通道使用。
您可以在单独的goroutine中消耗通道中的元素(在wg.Wait()
之前),也可以创建一个缓冲通道(例如:make(chan int, 10)
。