我刚刚开始学习Go语言,并达到了关于并发的课程。
我为自己发明了一个小任务,试图实现我所学到的关于关闭戈鲁廷的知识。
如果我们关闭信道,它将始终在语句中被选中,这是向所有戈鲁丁广播取消信号的好方法。case
select
下面我有2个戈鲁丁和一个从未被接收的频道。quit
操场上的代码超时。
如果我注释掉戈鲁丁中的部分,那么信号就会被接收到。default
quit
我真的不明白为什么会发生这种情况以及如何解决它,尽管我正在尝试。
有人可以向我解释问题是什么,并就如何解决它提供一些建议吗?
package main
import (
"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()
}
RISEBY
相关分类