go version go1.11 windows/amd64

本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 通道类型(Channel types)。

通道类型 为 通信而设计。

谁会用到它呢?协程,就是Go协程(goroutine),使用 go语句并发执行的函数或方法(concurrently executing functions)。

通信 包括 发送、接收 指定的元素类型的 值。

没有被初始化的 通道 的值为 nil。

关键字 chan,用于定义通道,,与操作符 <- 结合,可以限制通道是否 仅用于 发送 或 仅用于 接收(原文:A channel may be constrained only to send or only to receive by conversion or assignment.,自己的翻译存在缺失)。

chan T          // can be used to send and receive values of type T // 没有操作符 <-,双向通道,既可以发送,也可以接收
chan<- float64 // can only be used to send float64s // 发送通道
<-chan int // can only be used to receive ints // 接收通道

另外,多个关键字 chan 和 多个操作符<- 一起使用时(在一个语句中?),操作符<- 会和靠近它的最左边的关键字chan 结合:

chan<- chan int    // same as chan<- (chan int) // 元素类型为 双向通道chan int 的 发送型通道??
chan<- <-chan int // same as chan<- (<-chan int) // 元素类型为 接收型通道<-chan int 的 发送型通道??
<-chan <-chan int // same as <-chan (<-chan int) // 元素类型为 接收型通道<-chan int 的 接收型通道??
chan (<-chan int) // 加了括号就另当别论了

疑惑,上面这几个 语句 也是声明 通道时用的吗?都声明的是什么通道呢?通道的通道?什么时候会用到呢?哪种需求?

下面,进阶了!make函数初始化

使用 内建函数make 来 创建 和 初始化 通道 的值,并可以 建立 缓冲型通道——第二个参数capacity。

make(T)          channel    unbuffered channel of type T // 非缓冲型通道
make(T, n) channel buffered channel of type T, buffer size n // 缓冲型通道,缓冲区大小为n——字节吗?

注意,这里的 T 表示的是 chan int、chan<- int、<-chan int 之类的通道,int可以是其它的,表示元素类型。

参数capacity 用来 设置 通道的 缓冲区大小。如果capacity为0或缺失,那么,通道就是 非缓冲型的,非缓冲型的通道 只有在 发送通道和接收通道 都准备好时 才会通信成功(翻译或许存在问题,应该是 要想通信成功,无论哪种型的通道 都必须准备好)。

否则,如果通道是缓存型的,通信成功且没有阻塞的条件是 发送通道缓存不为是满的(full)、接收通道的缓存不是空的(empty)。

值为 nil 的 通道 是 没有准备好通信的。

疑问,前面讲了,没有初始化的 通道 的 值 为 nil。那么,怎么 初始化通道呢?请看下面的代码:

var ch1 chan int // 这就是未初始化的通道?
ch1 = make(chan int) // 这个通道初始化了?初始化必须用make?

可以参考 规格说明书中的An example package,通道在使用前都用了make函数初始化了。

下面,再进阶!close关闭通道

可以使用内建函数close关闭通道——关闭后的通道的值为 nil ?关闭是指 关闭 发送 还是 关闭 接收,或者 两者都关闭?

接收操作 的 多值赋值形式(the multi-valued assignment form of the receive operator) 会报告 一个接收到的值 是否是 在通道关闭前发送的。

疑问:有什么意义?接收的值 肯定是 在发送前发送的啊?!难道是因为 缓冲区的缘故?通道关闭的时候,缓冲区还有值,在通道关闭后,设置了这些值或通道的状态,然后再发送时,这些值带着通道被关闭的信息?又或者……应该是和缓存有关系。

更多说明。

单个的通道 可以被用在 发送语句、接收操作 中,而且 内建函数len、cap 可以被任意数量的 协程(goroutine)调用而不需要进一步操作。

通道表现的像一个 先进先出的队列(first-in-first-out queues)——关键,比如,发送通道按照次序发送数据,接收通道得到的数据 的顺序 和发送顺序一致。

后记

通道类型,自己也喜欢翻译为 信道类型。

还有一些疑问没搞清楚,需要更多代码和时间。

对于上面的基本介绍,可以 自己制造一些试验,运行,查看结果确认。

和 通道类型 相关的,还有 协程——Go语句、发送语句、接收操作 几个小节,结合一起看,可以更明白 通道类型 设计的意义。

当然,阅读更多 先行者 的文章也是很好的。

在自己前面的知识储备中,听说过 进程间通信、线程间通信、互斥量、信号量、锁、管道(pipe)等机制,这个通道类型 对于自己来说,还是很新鲜的,在一些博文中,提到了很多关于通道和goroutine配合使用的示例,需要看明白才行,否则,Go语言最大的优势和特点——并行——恐怕不能很好地发挥出来。

昨天看了一篇博文,提到了各种语言 对 并行性的支持,可以作为参考:

Go-简洁的并发

另一篇博文:

Go语言并发的设计模式和应用场景

这样的文章有不少,可以找找。

Go语言规格说明书 之 通道类型(Channel types)的更多相关文章

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

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  2. Go语言规格说明书 之 接口类型(Interface types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的  ...

  3. Go语言规格说明书 之 类型(Types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  4. Go语言规格说明书 之 内建函数(Built-in functions)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  5. Go语言规格说明书 之 select语句(Select statements)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  6. Go语言规格说明书 之 词汇元素(Lexical elements)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  7. Go语言规格说明书 之 结构体类型(Struct types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  8. Go语言规格说明书 之 类型声明(Type declarations)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  9. Go语言规格说明书 之 Go语句(Go statements)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

随机推荐

  1. 【洛谷P1230】智力大冲浪

    题目大意:给定 N 项任务,每项任务有一个截至完成时间,若在截止时间之后完成要罚款 \(w_i\) 元,最初有 M 元,怎样完成能够留下最多得钱. 题解:按照罚款从多到少贪心,在查找能够最晚完成一项任 ...

  2. 总算知道怎样从ImageMagick生成的数据转换成HICON: MagickGetImageBlob & LookupIconIdFromDirectoryEx

    MagickSetImageFormat(mw, "ICO"); //设置这个后, MagickGetImageBlob 才能返回正确的值 size_t length; PBYTE ...

  3. Python(四)——PyCharm的安装和使用

    python开发IDE: #专业版 #不要汉化 快捷键:Ctrl + ? = 整体注释

  4. poj 2186 "Popular Cows"(强连通分量入门题)

    传送门 参考资料: [1]:挑战程序设计竞赛 题意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系具有传递性,所以如果牛A认为牛 ...

  5. grafana-zabbix部署和使用

    grafana-zabbix安装 官网安装介绍地址:https://grafana.com/plugins/alexanderzobnin-zabbix-app/installation 下载地址:h ...

  6. dubbo序列化

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...

  7. 用 Lua 控制 MIDI 合成器来播放自定义格式乐谱

    用 Lua 控制 MIDI 合成器来播放自定义格式乐谱 作者: FreeBlues 最新: https://www.cnblogs.com/freeblues/p/9936844.html 说明: 本 ...

  8. toolbar 相关

    1.改变toolbar 返回键和扩展按钮颜色,只需要在style文件中添加这一行即可: 2.toolbar的title是否显示是这样控制的:

  9. java 调用windows的COM组件举例(使用JACOB)

    java 调用windows的COM组件举例(使用JACOB) (转自这里) 最近公司需要做一个效果,开发一个程序能在程序运行时打开microsoft office的相关软件,实时写入,然后能关闭,你 ...

  10. Scapy Fuzz实现——S7协议从建连到“正常交流“(一)

    转载:安全客 酝酿了“三秒钟“,准备理清逻辑写写我学习的心得,自认为和Siemens S7协议有过一段时间浅浅的“交流”,所以这过程中涉及到了自己整理的自认为有用的东西,涉及工具.脚本这般,发出来让大 ...