代码演示

package main

import "fmt"

func main() {
messages := make(chan string)
signals := make(chan bool)
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}

  

代码运行结果

no message received
no message sent
no activity

  

代码解读
select中的每个case必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
常规的通过通道发送和接收数据都是阻塞的,但是可以通过带default的select实现非阻塞的发送和接收数据
以上例子通过三个select来演示非阻塞的接收,发送,和多路选择
第一个select是非阻塞接收的例子,由于通道messages中没有值存在,所以select会到default中执行
第二个select是非阻塞发送的例子,这里要注意,由于通道messages在发送前,是一个nil通道,所以case也不会执行
第三个select是一个多路选择的例子

最新文章

  1. C#抽象方法和虚拟方法理解
  2. 美国 ZIP Code 一览表
  3. C# 中反射获取某类的子类和根据类型名动态创建对象
  4. phpwind9.0模板制作教程——制作论坛风格
  5. AngularJs $anchorScroll、$controller、$document
  6. 修改mysql默认字符集的方法
  7. 【转】用CSS代码写出的各种形状图形的方法
  8. 13test05:亲密数
  9. 《跨终端Web》读书笔记
  10. ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败
  11. 个人作业1——四则运算题目生成程序(基于C++)
  12. 凯撒密码加密解密--JAVA实现(基础)
  13. Django(其二)
  14. 通信导论-IP数据网络基础(3)
  15. Ubuntu 18.04 安装Virtual Box or VMWare workstation Pro 14
  16. gym 101873
  17. oracle无法启动asm实例记录
  18. jQuery图片上传前先在本地预览
  19. H5前端正则验证插件
  20. python正则二

热门文章

  1. Xamarin.Android调用百度地图
  2. CAS底层原理与ABA问题
  3. 将终结点图添加到你的ASP.NET Core应用程序中
  4. map数据按照list排序
  5. C++语法小记---少见的语法之一
  6. 解决nginx在Linux中已经正常启动,Windows端的浏览器却无法访问的问题
  7. 题解 洛谷 P4098 【[HEOI2013]ALO 】
  8. 用Python爬取双色球开奖信息,了解一下
  9. Android Studio报错问题集锦
  10. UUID字符串使用