golang select底层分析

110 阅读1分钟

作用:

  1. 检测channel是否准备完毕,可读或可写
  2. select语句运行期间,goroutine是阻塞,空select可以当睡眠用

slect 语句最重要的是case语句的结构

type case struct{
    c *hchan // channel主要结构
    kind uint16
    elem unsafe.Pointer 
}
  1. 字段解释:

    1. c是channel的主要数据结构,一个case只能操作一个channel
    2. kind 表示case的类型,读、写、defalut类型
    3. elem根据kind的不同,有不同意义
      • kind是读的时候,elem表示读出channel的数据地址
      • kind是写的时候,表示将要写入channel的数据的地址
  2. selct过程

    1. select会监听所有case的channel读写操作
    2. 如果case的channel可以完成这个case的读写操作,就根据case索引完成相应操作
    3. 如果所有case的channel操作都不可以,就会执行default
    4. 如果没有defaul,就会阻塞所在协程