Golang Channel 用法总结
之前的博客中已经粗略探究了一下 golang channel 的实现原理,本文总结一下使用 channel 的各种姿势。 先看一下对不同状态的 channel 的读,写,关闭操作的结果 1. 使用 for range 读取 channel 场景: 当需要不断从 channel 里读数据时 这是最常用的方式,又安全又便利,当channel 被关闭时,for 循环自动退出。 用法不再赘述。 2. 使用 _, ok 判断 channel 是否关闭 场景: 读 channel,但需要判断 channel 是否已关闭。 读 channel 的操作 <- chan 既可以返回一个值,也可以返回两个值,这里就是用的两个返回值的方式。 举例: if v, ok := <- ch; ok { // can read channel fmt.Println(v) } 读到数据,并且通道没有关闭时,ok 的值为 true。 通道关闭,无数据读到时,ok 的值为 false。 3. 与 select 搭配使用 场景: 需要对多个通道进行处理,或者设置超时 举例: func (h *Handler) handle(job *Job) { select { case h.jobCh<-job: return case <-h.stopCh: return case <- time.After(2): } } 这里有一个坑需要注意: 当 channel 为 nil,也就是没有初始化时,无论对应的 select case 是读还是写,都会立即返回。 而一般情况下,对 nil channel 的 写操作是要panic的。 ...