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相关推荐

  1. Go语言圣经 - 第8章 Goroutines 和 Channels - 8.8 示例:并发的目录遍历

    第8章 Goroutines 和 Channels Go语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在 ...

  2. go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels

    奋斗鸭!Day97 知识点 goroutinue 基本用法 golang非常深度的简化了goroutinue的使用方法,异常简单,门槛降低很多 // goroutinue 使用非常简单go f() G ...

  3. Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择

    没有什么比谈论一门新语言能够让程序员更加兴奋.更加固执己见的了.作为两枚冉冉升起的新星,Go和Rust让我们置身在这场旋窝之中.作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身 ...

  4. golang 开发常见坑

    目录 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 不能使用短变量声明来设置字段值 Can't Use Shor ...

  5. fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 Go 当前引起了很多关注.让我们看一下 Go 好的部分. 我最近用 Go 写了一个 SSH 服务器[1 ...

  6. Golang新开发者要注意的陷阱和常见错误

    原文: 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs   翻译: Go的50度灰:新Golang开发 ...

  7. 使用 Python 5 年后,我转向了Go

    我喜欢Python,在过去的五年里,它一直是我的首选语言.Python非常友好且易于学习,迄今仍然超级有效. 几乎可以用它来做任何事情 – 从创建简单的脚本,Web开发,到数据可视化以及机器学习. 但 ...

  8. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?

    [编者按]本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 这是一篇讲述将大块 Pyth ...

  9. Google Go:初级读本

    Google Go:初级读本 Tags: Go, golang, google from http://www.infoq.com/cn/articles/google-go-primer 作者 Sa ...

最新文章

  1. sklearn中的fit_transform和transform以及什么时候使用
  2. 第五期 IP数据包结构和OSI第三层网络层
  3. python输出日期语句_python输出语句怎么用
  4. 基于 CentOS Mysql 安装与主从同步配置详解
  5. jQuery滑盖式自定义radio选择框按钮 jTumbler - Beautiful, Slider-Style Selection Boxes
  6. Oracle11g新特性:在线操作功能增强-Oracle11g的只读表功能
  7. 重定位----操作系统做的事情
  8. java超级玛丽代码_java版超级玛丽源代码
  9. 基于 RK3399 5G 通信和图像增强算法的交通监控系统设计
  10. win10u盘被写保护怎么解除_win10系统U盘被写保护解除的操作方法
  11. 寄存器与七种寻址方式
  12. 企业无线接入平台好吗
  13. Wannacry浅析
  14. HDOJ 2504 又见GCD (水题)
  15. 【烈日炎炎战后端】Elecsticsearch(1.5万字)
  16. 网上书城图书模块及首页分页
  17. 蓝桥杯青少年创意编程大赛题解:数字组合
  18. 计算机一级操作详解,计算机一级操作详解
  19. 打开html自动跳转其他,打开网页直接跳转其他网页怎么办
  20. MP4文件格式详解(ISO-14496-12/14)

热门文章

  1. Python Django实现MySQL百万、千万级的数据量下载:解决memoryerror、nginx time out
  2. 粉丝问我,写CSDN博客到底为了什么?
  3. 学习java需要英语很好吗?
  4. ROS教程(二十一):Roslaunch在大型项目中的使用技巧
  5. Win7键盘组合快捷键大全
  6. 拼夕夕买家订单数据提取
  7. 拼多多 2019校园招聘 正式批笔试-2018.8.28
  8. 蓝桥杯 算法训练 JAM计数法
  9. word设置多级混合标题
  10. 我真希望你在参加面试前看到这篇文章