golang select详解

Golang
515
0
0
2022-05-06
标签   Golang基础
golang select 详解

channel详解文章中讲到过channel的阻塞写、阻塞读、非阻塞写、非阻塞读,这里不再赘述,需要说明的是,select不止用来做channel的非阻塞操作,主要是用来作为多路复用操作channel的,机制和linux的select很像

不同的写法会触发不同的机制,下面我们看看示例// 阻塞读,对应channel的 chanrecv1函数
select {
case <-c0:
    return
}

// 非阻塞读,对应channel的 selectnbrecv 函数
select {
case <-c0:
    return
default:
    return
}

// 多路复用
select {
case <-c0:
    return
case <-c1:
    return
default:
    return
}

从上面的代码中可以看出select的三种机制

1:只有一个case,并且没有default,相当于 <- c0的写法,阻塞读写数据

2:一个case,一个default,就会直接对应channel的非阻塞读写数据

3:有多个case,对应了真正的select多路复用机制,case随机执行,源码位于runtime/select.go

今天我们主要来讨论一下第三种机制

channel详解,相信你一定会有所收获