iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 13

Day 13 複習 golang concurrency 語法篇 II

今天複習一下 select 的語法

  • select 很像 switch 有很多個 case 和一個 default
  • 每一個 case 都會搭配一個 communication (也就是 send 和 receive 操作)
  • select 會選擇已經準備好通訊的 case (以此例來講,若 ch1 已經可以 receive, ch2 已經可以 send,就表示已經準備好)
  • 若是所有 case 皆沒準備好,則選擇 default case,若此 select 沒 default case 則 block
  • 當兩個 case 同時準備好,select 會隨機選擇一個 (注意:select 不會根據 case 的順序去選擇)
select {
case <- ch1:
    //...
case ch2 <- x:
    //...
default:
    //...
}

若 select 沒任何 case 和 default,則會永遠 block

select {}

在 select 裏我們也能用 receive 操作拿到值

select {
case x <- ch:
    fmt.Println(x)
}

Non blocking communication

透過 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

Reference

Go spec#Select_statements


上一篇
Day 12 複習 golang concurrency 語法篇 I
下一篇
Day 14 讀 Go Concurrency Patterns - Rob Pike I
系列文
golang 後端菜雞工程師學習雜記18

尚未有邦友留言

立即登入留言