更多评论
v,ok=<-chan
这里的ok
是说c
是否关闭,因为关闭之后从chan种读取数据会立即返回。
c:=make(chan int,2)
v,ok:=<-c // 阻塞,等待从c中读取数据
// 关闭chan
close(c)
v,ok:=<-c //不会阻塞,立即返回,如果此次从chan中读取到了值,则ok为true,否则为false且v为零值
@justay 问题是我的channel 没有全部接收完毕啊, chan怎么会被关闭那? 这是完整代码
package main
import (
"fmt"
"os"
)
func main() {
ch1,ch2 := make(chan int, 3), make(chan int)
go func() {
v, ok, s := 0, false, ""
for {
select {
case v, ok = <- ch1:
s = "a"
case v, ok = <- ch2:
s = "b"
}
if ok {
fmt.Println("v&s",v, s)
}else {
os.Exit(1)
}
}
}()
for i:= 1; i < 4; i++ {
select {
case ch1 <- i:
case ch2 <- i:
}
}
fmt.Println("send over")
close(ch1)
close(ch2)
fmt.Println("ch",ch1,ch2)
select {} // 阻塞进程
}