在线文档  >   Golang练习   >   非阻塞通道操作

在Go中,基本的通道发送和接收数据都是阻塞的。
但是,我们可以使用selectdefault子句来实现非阻塞发送、接收,甚至是非阻塞多路select

package main

import "fmt"

func main() {
    messages := make(chan string)
    signals := make(chan bool)

    // 这是一个非阻塞接收。
    // 如果`messages`上有可用值,则`select`会接受具有该值的`<-messages`的`case`。
   //如果没有,它将接受`default` case。
    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    default:
        fmt.Println("no message received")
    }

    // 非阻塞发送的工作方式类似。
    // 在这里,由于通道没有缓冲区且没有接收器,因此`msg`无法发送到`messages`通道。
    // 因此选择了默认情况。
    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
    }

    // 我们可以在`default`子句上方使用多个`case`来实现多路非阻塞选择。
    //在这里,我们尝试在`messages`和`signals`上进行非阻塞接收。
    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}

运行结果如下:

$ go run non-blocking-channel-operations.go 
no message received
no message sent
no activity