Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)
go version go1.11 windows/amd64
本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 通道 发送语句(send) 和 接收操作符(receive)。
通道 主要用于 协程间通信,于是,就有发送、接收操作。在Go语言规格说明书中,发送 是 语句,接收 是 表达式——why?
疑惑,发送通道 和 接收通道 是怎么配合起来的呢?需要配合吗?前面看了一些代码和介绍,没看明白!希望本文完毕可以搞清楚!
发送语句(Send statement )
在一个通道上 发送 一个值,是 一个值。
需要注意的是,通道必须是 可以发送型的,而且发送的值 的类型 必须可以 赋值给(assignable) 通道的元素类型。
SendStmt = Channel "<-" Expression .
Channel = Expression .
在通信开始前,上面的channel、Expression都必须被求值(evaluated)。通信会阻塞 直到 发送可以执行。
对于 无缓冲区通道,只要 接收通道 准备好了 就可以发送;
对于 有缓冲区通道,只要 缓冲区有空余位置 就可以发送;
对于 已经关闭了的通道,发送会导致 运行时错误(run-time panic);
对于 值为 nil 的通道,发送会被 永久阻塞(blocks forever)。
ch <- 3 // send value 3 to channel ch // 无类型的 3 发送给 通道ch,这里的通道ch的元素类型 需要 可以给 3 赋值,比如,元素类型为 int、int32、int64、float32、float64(需要试验)
好像,发送语句 挺简单的嘛!
接收操作符(Receive operator)
接收 操作符,即 <-。
对于一个 通道类型 的操作数 ch,接收操作 <-ch 的值就是 通道ch 接收到的值——从哪里接收的?
通道ch 必须支持 接收操作,接收操作 的类型 必须是 通道ch 的元素类型。
这是一个表达式。
此表达式会阻塞,直到有值被接收到为止;
从一个值为 nil 的通道接收,将永久阻塞;
从一个已经关闭的通道接收,会立即执行,但 会接收到 之前发送的数据 并跟着一个 通道的元素类型的0值(zero value)——以通道类型的0值结尾。
v1 := <-ch // 从通道ch接收到值并赋值给变量v1
v2 = <-ch // 从通道ch接收到值并赋值给v2
f(<-ch) // 调用函数f,参数为 接收型通道——支持接收的通道,,难度高点
<-strobe // wait until clock pulse and discard received value // 不懂
进阶:接收表达式 给 多个 左操作数赋值(也叫做 多值赋值 吧?)
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch // 多一个 T 是什么意思?
在前面的官文示例中,只是把接收到的值复制给1个变量,可上面这个示例确实赋值给两个变量,第二个变量名为 ok,有其意义,见下面的解读。
上面这种形式会产生一个 无类型的布尔量,用来 报告 通信是否成功。
如果ok的值是 true,表明 接收到的值 是被一个指向这个通道成功的发送操作 发送的;
如果ok的值是false,表明 接收到的是 特别制造的0值——因为发送通道关闭了并且为空(closed and empty)。
后记
发送、接收,官文就介绍这么多了。
仍然没有解决俺的问题——发送通道、接收通道 怎么配合的?
需要继续求索。
Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)的更多相关文章
- Go语言规格说明书 之 通道类型(Channel types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 select语句(Select statements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 内建函数(Built-in functions)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 词汇元素(Lexical elements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 Go语句(Go statements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 类型(Types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 接口类型(Interface types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 变量声明(Variable/Short variable declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 结构体类型(Struct types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
随机推荐
- mongodb集群故障转移实践
简介 NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向 ...
- mockery expectation 覆盖
public function testOverrideExpectation() { // 如果没有指定 expectation 调用次数, 那么每次调用 mock 的 expectation 方法 ...
- 错误:分析 EntityName 时出错 web配置
会发生这种错误的环境:ASP.NET 或 XML情况:一个原本运行正常的C#页面,因为SQL的密码更改后一直出现“分析 EntityName 时出错”错误,验证过web.config的SQL Conn ...
- JS 中函数名后面加与不加括号的区别
a.onmouseover = fn1; a.onmouseout = fn2; function fn1(){ div.className = "erweima show"; } ...
- SparkRDD简介/常用算子/依赖/缓存
SparkRDD简介/常用算子/依赖/缓存 RDD简介 RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区. ...
- Keil stm32 printf到Debug窗口
使用JlinkV8+Keil41.在main.c输入以下代码 #include <stdio.h> #define ITM_Port8(n) (*((volatile unsigned c ...
- linux4.10.8 内核移植(一)---环境搭建及适配单板。
一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel. ...
- CTSC&APIO2018游记
Day-1 布吉岛干什么,好像只看了Splay Day0 再次布吉岛干什么,好像也只看了Splay 然后上了火车 wc没买方便面,只能吃40元的盒饭 半夜睡不着,那应该是我太菜了 Day1 九点下火车 ...
- luogu P4289 [HAOI2008]移动玩具
传送门 这道题可以二进制记录状态搜索 也可以做以下考虑 若一个棋子要移动到另一个位置上去,则步数为两点的曼哈顿距离(横坐标差的绝对值+纵坐标差的绝对值),因为假设路径上有其他的棋子,可以通过移动其他棋 ...
- POJ1751 Highways【最小生成树】
题意: 给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的). 但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的 ...