CodeFun Go

非阻塞通道操作

在通道选择器 select 中,如果任何 case 语句都没有准备好发送或接收操作,这样就会一直阻塞下去。

为了防止 select 中永远阻塞,还可以加一个 default 分支。

在示例中有一个 select 语句,它在等待 ch1 上的接收操作和一个 default 语句。

由于没有 goroutine 发送到通道 ch1,因此执行默认情况并退出 select。如果不存在默认情况,则 select 将被阻塞。

package main

import "fmt"

func main() {
    ch1 := make(chan int)
    select {
    case msg := <-ch1:
        fmt.Println(msg)
    default:
        fmt.Println("default case")
    }
}
default case