今天複習一下 select 的語法
select {
case <- ch1:
//...
case ch2 <- x:
//...
default:
//...
}
若 select 沒任何 case 和 default,則會永遠 block
select {}
在 select 裏我們也能用 receive 操作拿到值
select {
case x <- ch:
fmt.Println(x)
}
透過 select 的 default case 我可以達到 non-blocking 的效果,也就是說 communication 還沒準備好時,我並不想被 select 給 block 住。以下我也順便附上 blocking 的程式做對照
non blocking send
// non blocking send
select {
case ch <- x:
//...
default:
//...
}
// blocking send
ch <- x
non blocking receive
// non blocking receive
select {
case x := <- ch:
//...
default:
//...
}
// blocking receive
x := <- ch
今天卻蠻廢的就寫了個 select 語法,但也沒辦法都忘光了,明天來看 Go Concurrency Patterns - Rob Pile