我試圖更好地理解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
雖然我明白,只有0
旨意得到印刷我不明白爲什麼第一次發送仍然會觸發select的default
分支?
什麼是後面的選擇在這種情況下的行爲邏輯?
所以我的例子'0'打印的是'int'的零值,而不是我認爲我會發送的值? – m90
@ m90:是的,未緩衝的頻道已經關閉,所以沒有收到任何東西。 – JimB