【发布时间】:2014-09-16 02:38:58
【问题描述】:
我阅读了有关 select 语句及其执行步骤的信息,但我并没有完全理解这里发生了什么。
我创建了两个扇入函数示例(来自Go Concurrency Patterns talk)
select {
case value := <-g1:
c <- value
case value := <-g2:
c <- value
}
按预期从每个通道打印(每个通道都有自己的计数器):
Bob : 0
Alice: 0
Bob : 1
Alice: 1
Bob : 2
Alice: 2
Alice: 3
Alice: 4
Bob : 3
Alice: 5
select {
case c <- <-g1:
case c <- <-g2:
}
它是随机选择一个通道并丢弃另一个通道的值:
Bob : 0
Alice: 1
Alice: 2
Alice: 3
Bob : 4
Alice: 5
Bob : 6
Alice: 7
Alice: 8
Bob : 9
更新:在写这个问题的时候,我想到了第二个selectwas equal to:
var v string
select {
case v = <-g1:
case v = <-g2:
c <- v
}
但我错了,因为这个总是从第二个通道打印(正如 switch 语句所期望的那样,因为 select 语句中没有失败):
Bob : 0
Bob : 1
Bob : 2
Bob : 3
Bob : 4
Bob : 5
Bob : 6
Bob : 7
Bob : 8
Bob : 9
有人明白为什么我的第二个示例会创建一个序列吗?
谢谢,
【问题讨论】:
-
我......实际上不确定那里发生了什么,但我会告诉你你的第三个示例不起作用,因为没有自动失败(在选择语句中也没有失败,句号) .
-
@andlabs,你是对的,谢谢将编辑问题
标签: select concurrency go