• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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)。

 

后记

发送、接收,官文就介绍这么多了。

仍然没有解决俺的问题——发送通道、接收通道 怎么配合的?

需要继续求索。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go结构体指针方法与结构体方法的区别发布时间:2022-07-10
下一篇:
Go入门笔记-15Go使用反射发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap