Select 选择语句细微差别
我读过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
选择:
有人理解我的第二个示例为什么创建序列吗?
谢谢,根据[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:
}