以下程序从不打印“完整”。取消注释fmt.Println(len(choke))
时,程序在通道已满时输出“Full”。
package main
import (
"fmt"
)
func main() {
choke := make(chan string, 150000)
go func() {
for i := 0; i < 10000000; i++ {
choke <- string(i)
fmt.Println("i=", i)
}
}()
for {
//fmt.Println(len(choke))
if len(choke) >= 150000 {
fmt.Println("Full")
}
}
}
@ tim-heckman在OP中解释了这种行为的原因。
如何在不使用热循环的情况下检测到通道已满?
答案 0 :(得分:3)
在写入端使用select
语句。如果有可用缓冲区或接收器正在等待,它将写入通道;如果频道已满,它将落到default
的情况下。
func main() {
choke := make(chan string, 150000)
var i int
for {
select {
case choke <- string(i):
i++
default:
fmt.Println("Full")
return
}
}
}