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


<<:  [30天 Vue学好学满 DAY13] 组件

>>:  # Day 4 Feature status on riscv architecture

Day-24 DOM Node

DOM节点的建立 建立新元素 建立新元素,系使用 document.createElement(),...

实战练习 - 使用 RxJS 实作「自动完成 / 搜寻 / 排序 / 分页」功能

今天我们用实际的例子来练习各种 RxJS operators 的组合运用!在一般的应用程序里面,资料...

Vue.js指令(v-if & v-show & v-for)(DAY30)

v-if v-if/v-else/v-else-if 的用法就像是JavaScript的判断式,使...

Day16-TypeScript(TS)在类别(Class)实作介面(Interface)

今天要来介绍类别实作介面, 介面型别我觉得很大的一个优势是可以重复使用, 因此我们就来说说这个吧。 ...

Day 0x17 - 建立订单(赞助)的画面

0x1 前言 发现缺的东西太多了,所以临时改成投赞助的画面 0x2 修改内容 首页画面 // res...