【发布时间】:2018-01-08 19:53:16
【问题描述】:
我正在努力更好地了解 golang 频道。在阅读this article 时,我正在玩弄非阻塞发送并想出了以下代码:
package main
import (
"fmt"
"time"
)
func main() {
stuff := make(chan int)
go func(){
for i := 0; i < 5; i ++{
select {
case stuff <- i:
fmt.Printf("Sent %v\n", i)
default:
fmt.Printf("Default on %v\n", i)
}
}
println("Closing")
close(stuff)
}()
time.Sleep(time.Second)
fmt.Println(<-stuff)
fmt.Println(<-stuff)
fmt.Println(<-stuff)
fmt.Println(<-stuff)
fmt.Println(<-stuff)
}
这将打印:
Default on 0
Default on 1
Default on 2
Default on 3
Default on 4
Closing
0
0
0
0
0
虽然我明白只有0s 会被打印出来,但我真的不明白为什么第一次发送仍然会触发选择的default 分支?
在这种情况下,选择行为背后的逻辑是什么?
【问题讨论】: