Select 选择语句细微差别

Select 选择语句细微差别,select,concurrency,go,Select,Concurrency,Go,我读过select语句及其执行步骤,但我不完全理解这里发生了什么 我创建了两个扇入函数示例(来自) : : 更新:在写这个问题时,我想第二个选择: 有人理解我的第二个示例为什么创建序列吗? 谢谢,根据[Go编程语言规范 for { // send random sequence of bits to c select { case c <- 0: // note: no statement, no fallthrough, no folding of cases

我读过select语句及其执行步骤,但我不完全理解这里发生了什么

我创建了两个扇入函数示例(来自)

:

:

更新:在写这个问题时,我想第二个
选择

有人理解我的第二个示例为什么创建序列吗?

谢谢,

根据[Go编程语言规范

for {  // send random sequence of bits to c
    select {
    case c <- 0:  // note: no statement, no fallthrough, no folding of cases
    case c <- 1:
    }
}
对于{//向c发送随机位序列
挑选{

案例c您的第二个select语句被解释为:

v1 := <-g1
v2 := <-g2
select {
case c <- v1:
case c <- v2:
}

v1:=我……实际上不确定那里发生了什么,但我要告诉您,您的第三个示例不起作用,因为没有自动故障排除(select语句中也没有故障排除,句号).@andlabs,你说得对,谢谢你会编辑问题谢谢,我想我理解。让我困惑的是,它会一直等到两个通道都准备好发送。Alice在中间准备好了,而Bob在发送值之前有一个延迟,但不是执行第一个
案例
选择
总是等待延迟Bob(所以这个符号会产生严重的性能问题,我不明白为什么它没有列为特例=P)正如我在回答中提到的,select语句的实际工作是在对语句的每个分支的RHS进行评估之后才执行的。在决定发送到
c
之前,需要从
g1
g2
接收值。程序不会单独等待每次发送或接收可能是表达式一部分的ve操作。
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
var v string
select {
case v = <-g1:
case v = <-g2:
    c <- v
}
Bob  : 0
Bob  : 1
Bob  : 2
Bob  : 3
Bob  : 4
Bob  : 5
Bob  : 6
Bob  : 7
Bob  : 8
Bob  : 9
for {  // send random sequence of bits to c
    select {
    case c <- 0:  // note: no statement, no fallthrough, no folding of cases
    case c <- 1:
    }
}
select {
case c <- <-g1:
case c <- <-g2:
}
v1 := <-g1
v2 := <-g2
select {
case c <- v1:
case c <- v2:
}