Go 示例: 非阻塞通道操作

通道上的基本发送和接收是阻塞的。但是,我们可以使用带有default子句的select来实现非阻塞发送、接收,甚至非阻塞的多路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通道,因为通道没有缓冲区,也没有接收器。因此,选择了default case。

    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
    }

我们可以在default子句之上的多个case中使用,以实现多路非阻塞选择。这里我们尝试在messagessignals上进行非阻塞接收。

    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

下一个示例:关闭通道.