私はゴランのチャンネルをよりよく理解しようとしています。最初のケースが実際に実行されたときに、常にこの選択がデフォルトのケースを実行するのはなぜですか?
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
sが印刷されますことを理解しないがthis articleを読んでいる間、私は非ブロッキング送信し、次のコードが出ているといじりますよ最初の送信が依然としてdefault
のブランチをトリガーしている理由がわかりません。
この場合のselectの動作の背景にある論理は何ですか?
私の印刷例は 'int'のゼロ値で、私が送ると思う値ではありません。 – m90
@ m90:はい、バッファされていないチャネルは既に閉じられているため、何も受信されませんでした。 – JimB