介绍:我刚刚开始学习Go语言,并达到了关于并发的课程。我为自己发明了一个小任务,试图实现我所学到的关于关闭戈鲁廷的知识。问题:如果我们关闭信道,它将始终在语句中被选中,这是向所有戈鲁丁广播取消信号的好方法。caseselect下面我有2个戈鲁丁和一个从未被接收的频道。quit操场上的代码超时。如果我注释掉戈鲁丁中的部分,那么信号就会被接收到。defaultquit问题:我真的不明白为什么会发生这种情况以及如何解决它,尽管我正在尝试。有人可以向我解释问题是什么,并就如何解决它提供一些建议吗?package mainimport ( "fmt" "sync" "time")func positive_numbers(quit chan struct{}, wg *sync.WaitGroup) { defer wg.Done() i := 1 for { select { case <-quit: fmt.Println("[+]Quiting...") return default: fmt.Printf("%v ", i) i++ } }}func negative_numbers(quit chan struct{}, wg *sync.WaitGroup) { defer wg.Done() i := -1 for { select { case <-quit: fmt.Println("[-]Quiting...") return default: fmt.Printf("%v ", i) i-- } }}func main() { quit := make(chan struct{}) wg := sync.WaitGroup{} // so we can wait for all goroutines to finish wg.Add(2) go positive_numbers(quit, &wg) go negative_numbers(quit, &wg) go func(quit chan struct{}) { defer close(quit) time.Sleep(1 * time.Second) }(quit) wg.Wait()}
1 回答
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消