8、Goroutines和Channels
8.1 Goroutines
go语句是一个普通的函数或方法调用前加上关键字go。go语句会使其语句中的函数在一个新创建的goroutine中运行。
8.4 Channels
channels是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。使用内置的make函数,我们可以创建一个channel。
一个channel有发送和接受两个主要操作:
ch <- x // a send statement
x = <-ch // a receive expression in an assignment statement
<-ch // a receive statement; result is discarded
使用内置的close函数就可以关闭一个channel:close(ch)
一个基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作,当发送的值通过Channels成功传输之后,两个goroutine可以继续执行后面的语句。反之,如果接收操作先发生,那么接收者goroutine也将阻塞,直到有另一个goroutine在相同的Channels上执行发送操作。
当一个被关闭的channel中已经发送的数据都被成功接收后,后续的接收操作将不再阻塞,它们会立即返回一个零值。
Go语言的类型系统提供了单方向的channel类型,分别用于只发送或只接收的channel。类型chan<- int表示一个只发送int的channel,只能发送不能接收。相反,类型<-chan int表示一个只接收int的channel,只能接收不能发送。
在调用make函数创建channel时通过第二个参数指定队列的最大容量:
ch = make(chan string, 3)
cap函数返回channel的容量,len函数返回元素的个数。
8.7 基于select的多路复用
select会等待case中有能够执行的case时去执行。当条件满足时,select才会去通信并执行case之后的语句;这时候其它通信是不会执行的。一个没有任何case的select语句写作select{},会永远地等待下去:
select {
case <-ch1:
// ...
case x := <-ch2:
// ...use x...
case ch3 <- y:
// ...
default:
// ...
}
如果多个case同时就绪时,select会随机地选择一个执行,这样来保证每一个channel都有平等的被select的机会。
转载于:https://my.oschina.net/zhuhui/blog/3079947
8、Goroutines和Channels相关推荐
- Go语言圣经 - 第8章 Goroutines 和 Channels - 8.8 示例:并发的目录遍历
第8章 Goroutines 和 Channels Go语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在 ...
- go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels
奋斗鸭!Day97 知识点 goroutinue 基本用法 golang非常深度的简化了goroutinue的使用方法,异常简单,门槛降低很多 // goroutinue 使用非常简单go f() G ...
- Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择
没有什么比谈论一门新语言能够让程序员更加兴奋.更加固执己见的了.作为两枚冉冉升起的新星,Go和Rust让我们置身在这场旋窝之中.作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身 ...
- golang 开发常见坑
目录 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 不能使用短变量声明来设置字段值 Can't Use Shor ...
- fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言
点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 Go 当前引起了很多关注.让我们看一下 Go 好的部分. 我最近用 Go 写了一个 SSH 服务器[1 ...
- Golang新开发者要注意的陷阱和常见错误
原文: 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs 翻译: Go的50度灰:新Golang开发 ...
- 使用 Python 5 年后,我转向了Go
我喜欢Python,在过去的五年里,它一直是我的首选语言.Python非常友好且易于学习,迄今仍然超级有效. 几乎可以用它来做任何事情 – 从创建简单的脚本,Web开发,到数据可视化以及机器学习. 但 ...
- Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
[编者按]本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 这是一篇讲述将大块 Pyth ...
- Google Go:初级读本
Google Go:初级读本 Tags: Go, golang, google from http://www.infoq.com/cn/articles/google-go-primer 作者 Sa ...
最新文章
- sklearn中的fit_transform和transform以及什么时候使用
- 第五期 IP数据包结构和OSI第三层网络层
- python输出日期语句_python输出语句怎么用
- 基于 CentOS Mysql 安装与主从同步配置详解
- jQuery滑盖式自定义radio选择框按钮 jTumbler - Beautiful, Slider-Style Selection Boxes
- Oracle11g新特性:在线操作功能增强-Oracle11g的只读表功能
- 重定位----操作系统做的事情
- java超级玛丽代码_java版超级玛丽源代码
- 基于 RK3399 5G 通信和图像增强算法的交通监控系统设计
- win10u盘被写保护怎么解除_win10系统U盘被写保护解除的操作方法
- 寄存器与七种寻址方式
- 企业无线接入平台好吗
- Wannacry浅析
- HDOJ 2504 又见GCD (水题)
- 【烈日炎炎战后端】Elecsticsearch(1.5万字)
- 网上书城图书模块及首页分页
- 蓝桥杯青少年创意编程大赛题解:数字组合
- 计算机一级操作详解,计算机一级操作详解
- 打开html自动跳转其他,打开网页直接跳转其他网页怎么办
- MP4文件格式详解(ISO-14496-12/14)