1 回答
TA贡献1840条经验 获得超5个赞
下半部分的频道与前半部分的频道相同。qcontrol[0...3]
您正在运行的通道也会从所有这些通道读取,而不会出现延迟。reflect.Select
我认为问题归结为您的运行速度太快并立即“窃取”所有通道输出。这就是为什么永远无法读取消息的原因。reflect.Selectrandmsgs
您会注意到,如果从 中删除默认大小写,则该函数能够(可能)从 中读取一些消息。randmsgsq
select {
case <-q:
fmt.Println("Just sitting by the mailbox. :(")
return
}
这是因为现在它正在无延迟地运行,它总是在等待消息,因此有机会在比赛中击败。qreflect.Select
如果您从多个 goroutine 的同一通道读取,则传递的数据将简单地转到首先读取的任何 goroutine。
这个程序似乎只是一个实验/学习经验,但我会提供一些可能有帮助的批评。
同样,通常,如果两个goroutine执行不同的任务,则您不会有多个goroutine从同一通道读取。您正在创建一个大多数非确定性的竞赛,即哪个goroutine首先获取数据。
其次,这是一个常见的初学者的反模式,你应该避免选择:
for {
select {
case v := <-myChan:
doSomething(v)
default:
// Oh no, there wasn't anything! Guess we have to wait and try again.
time.Sleep(time.Second)
}
此代码是多余的,因为其行为方式已经达到这样的状态,即如果最初没有准备好任何案例,它将等到任何案例准备就绪,然后继续处理该案例。这有效地使您的选择循环变慢,但实际在通道上等待的时间更少(因为99.999...%的时间都花在 )。selectdefault: sleeptime.Sleep
- 1 回答
- 0 关注
- 56 浏览
添加回答
举报