首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go程序例子(35):非阻塞通道操作

Go程序例子(35):非阻塞通道操作

原创
作者头像
用户11078756
发布2024-12-18 09:23:19
发布2024-12-18 09:23:19
1530
举报
文章被收录于专栏:go程序例子go程序例子

通道上的基本发送和接收操作是阻塞的。然而,我们可以使用带有 default 子句的 select 来实现非阻塞的发送、接收,甚至是非阻塞的多路选择。

代码语言:go
复制
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 来实现多路非阻塞选择。在这里,我们尝试对 messages 和 signals 通道进行非阻塞接收。
    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}

运行结果:

代码语言:javascript
复制
$ go run non-blocking-channel-operations.go 
no message received
no message sent
no activity

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档