我有一个问题。以下是示例:https://play.golang.org/p/QSWY2INQuSE
func Avg(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
c <- "test"
}
func main() {
var wg sync.WaitGroup
c := make(chan string)
timer1 := time.NewTicker(5 * time.Second)
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
}
}
fmt.Println(<-c)
}
为什么数据无法到达fmt.Println(<-c)
谢谢!
答案 0 :(得分:4)
因为您有无尽的for
,所以永远不会达到最后的fmt.Println()
语句。
如果你想要执行最后一个fmt.Println()
语句,你必须打破循环,例如:
loop:
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
break loop
}
}
fmt.Println(<-c)
请注意,您必须使用标签,否则break
只会突破select
语句(而不是for
循环)。
另请注意,仅此一项无效,因为频道未缓冲,因此Avg()
将永久阻止,尝试在c
上发送值,而没有人试图从它
如果您创建要缓冲的频道,则可以使用此简单示例:
c := make(chan string, 1) // Buffer for 1 value
现在它可以正常工作并打印(在Go Playground上试试):
test