2 回答
TA贡献1998条经验 获得超6个赞
你的代码:
创建一个无缓冲的通道
trueChan
。创建 10 个 goroutine,每个 goroutine 都将尝试写入
trueChan
,这将阻塞直到有东西从中读取。关闭
trueChan
,然后返回main()
main()
打印0
,因为它还没有从 goroutine 中读取任何内容同时,由于
trueChan
在步骤 3 中关闭,在 goroutine 完成使用它之前,第一个尝试写入通道的 goroutine 出现恐慌
至少,在trueChan
您知道所有 goroutine 都已完成之前,您不应该关闭它。实际上,您甚至在他们开始使用它之前就将其关闭。
Async.WaitGroup
可能是做到这一点的一种方法,但在你的代码中如何做到这一点并不明显,因为我不完全确定你的目标。这段代码看起来像一个简单的练习,而不是一个真实的例子。如果你能解释你的目标,我可能会提供更具体的建议。
TA贡献1802条经验 获得超4个赞
您的第一个和第二个问题在同一个根源:
您在主程序中关闭通道,程序关闭通道,在您的例程将数据发送到通道之前退出程序您
通常必须在使用该程序的延迟中关闭通道香奈儿。例如,对于 yout 代码的修复:
package main
import (
"fmt"
)
func execute(trueChan chan<- bool, lowerRange int32, upperRange int32) {
go func() {
defer func(){
close (trueChan)
}()
for lowerRange <= upperRange {
fmt.Printf("\n handling number %v", lowerRange)
if lowerRange%2 == 0 {
trueChan <- true
}
lowerRange++
}
}()
}
func main() {
counter := 0
trueChan := make(chan bool)
execute(trueChan, 5, 25)
for _ = range trueChan{ // For small improvement here. Ref as below
counter++
}
fmt.Printf("\n%v", counter)
}
https://tour.golang.org/concurrency/4
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报