我试图更好地理解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