go version go1.11 windows/amd64

本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 select语句(Select statements)。

前面写了 Go语句、通道类型(也有翻译为 信道 的)、发送语句和接收操作符 的博文,再加上本文的 select语句,Go语言中 关于 信道和goroutine(协程) 的内容就学习完毕了。

阅读参考链接1,可以获得更多信息。

通过前面的学习,俺知道——select语句和switch语句不同的是,其case条件都是 通信操作——信道,select语句会被阻塞,也可以执行,执行时,只会 随机选择 多个 可执行case语句 中的一个 执行,如果每一个case语句都不可以执行,那么,在有default语句时执行default,没有default就一直阻塞。在使用select语句时,要特别注意每个case语句的通信是否可以执行,或者会阻塞,而这也是使用select语句的重难点。

下面是官文的翻译(水平有限,欢迎指正、补充):

select语句用来 挑选一系列发送和接收操作中的一个来执行。它看起来和switch语句很像,但它的所有case子句 涉及到 通讯操作。

在一个用于接收语句的case子句中,可以把接收语句的结果赋值给1个或2个变量,这里的赋值可以使用 简短变量声明的方式(:=),这里的接收表达式必须是一个接收操作(可以用圆括号括起来)。

select语句中最多可以出现一个default子句,而这个default子句可以出现在case子句列表的任意位置。

select语句将按照下面的步骤来执行:

1.对于所有case子句,接收操作的 信道操作数 和 信道(<- ch) 和 发送语句的右侧表达式(ch <- x) 只会被 求值 1次,而且是按照源码的顺序。

结果 是 一系列信道 接收到或发送出,以及发送的相关值。

上句原文:The result is a set of channels to receive from or send to, and the corresponding values to send.

在求值过程中的任何负面效应,...

上句原文:Any side effects in that evaluation will occur irrespective of which (if any) communication operation is selected to proceed.

使用简短变量声明或赋值 的 接收语句左侧的表达式 还没有被求值。(本步骤翻译存在问题)

2.如果一个或更多的通信可以执行,只有一个会被随机选中(a uniform pseudo-random selection)执行。

否则(没有通信可以执行),如果有default子句,则default子句会被选择,,如果没有default子句,那么,select语句会被阻塞——直到任何一个case子句的通信可以执行。

3.除非选择的语句是default子句,否则,选择的case子句的通信操作会被执行(翻译不太准确)。

4.如果选择的case子句是一个简短声明或赋值的接收操作,那么,其左侧的表达式会被求值,并且接收到的值(1个或2个)会被赋值给左侧表达式。

5.被选择的case子句下的语句列表被执行。

说明,上面的翻译有问题,也说明自己不是很理解,尤其是第一步,有些不明所以。还需要更多理解,后面再找机会完善(可能)。另外,原文中的proceed翻译有问题,其和block是相对的。

由于和值为 nil 的信道通信是不会得到执行的,因此,如果select语句中只有 值为 nil 的信道 的 发送和接收操作的话,select语句将会永久被阻塞。

官文示例:

var a []int
var c, c1, c2, c3, c4 chan int // 信道只是 被声明,但没有被初始化,值为nil,因此,下面的select语句的case子句会被阻塞,因为有default子句,因此,输出no communication
var i1, i2 int
select {
case i1 = <-c1:
print("received ", i1, " from c1\n")
case c2 <- i2:
print("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
print("received ", i3, " from c3\n")
} else {
print("c3 is closed\n")
}
case a[f()] = <-c4:
// same as:
// case t := <-c4
// a[f()] = t
default:
print("no communication\n")
} for { // send random sequence of bits to c
select {
case c <- 0: // note: no statement, no fallthrough, no folding of cases
case c <- 1:
}
} select {} // block forever

参考链接

1.RUNOOB.COM 之 Go 语言 select 语句

后记

本文得分:50。

虽然学习了 信道和协程 相关内容,可是,自己对如何使用它们还是处于 模糊不清 状态的。该怎么进阶呢?看代码?看官文Effective Go的相关内容?

还要琢磨清楚 一些代码的具体运行原理。

目前自己学习的水平,可以用Golang来解决什么问题呢?怎么用它最特色的 信道和协程 呢?

信道和协程 的设计,到底有什么好处?为何Docker是使用Go开发的?不用Go,能用其它编程语言开发出来吗?

Go语言规格说明书 之 select语句(Select statements)的更多相关文章

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

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

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

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

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

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

  4. Go语言规格说明书 之 通道类型(Channel types)

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

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

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

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

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

  7. Go语言规格说明书 之 变量声明(Variable/Short variable declarations)

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

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

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

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

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

随机推荐

  1. 【SPOJ283】Naptime

    题目大意:给定一个由 N 个点组成的环,点有点权,现从中选出 M 个点,对于顺时针方向来说,每一段被选取的第一个点的点权不计入答案贡献,求选出的最大权值是多少. 题解:首先考虑线性的情况,设 \(dp ...

  2. 【LOJ#6282】数列分块6

    题目大意:给定一个由 N 个数组成的序列,维护两种操作:单点询问,单点插入.N < 100000 题解:在块内维护一个链表,支持动态插入数字,同时对于非随即数据来说,若块的大小过大,需要重构. ...

  3. 关于移动端及flex

    我们知道写pc页面的时候,ui设计图是多少px,我们写网页的时候,就会写多少px,这个其实就是由pc端屏幕的物理像素,和我们设计图的css逻辑像素决定的,由于屏幕的物理像素和css逻辑像素比,刚好是1 ...

  4. python3写入文件时编码问题报错

    在字符串写入文件时,有时会因编码问题导致无法写入,可在open方法中指定encoding参数 chfile = open(filename, 'w', encoding='utf-8') 这样可解决大 ...

  5. Java连接访问Oracle--Connection.setSavepoint()方法使用

    使用时有一个重要前提:你不能使用oracle的classes12.jar,需要把oracle的jdbc驱动替换成ojdbc14.jar,否则savepoint()功能不能使用(出现“abstract方 ...

  6. JVM总结(六):晚期(运行期)优化

    这节我们总结一下JVM运行期的优化问题. JVM运行期优化 即时编译器(JIT) 编译对象与触发条件 编译对象 触发条件 编译过程 编译优化技术 JVM运行期优化 Java程序在运行的期间,可能会有某 ...

  7. 史上最全 40 道 Dubbo 面试题及答案

    https://blog.csdn.net/zl1zl2zl3/article/details/83721147

  8. Java编程思想 学习笔记10

    十.内部类  可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性.然而必须要了解,内部类和组合是 ...

  9. PHP第三方登录—OAuth2.0协议

    第2章 OAuth授权流程详解 

  10. Python HTML操作(HTMLParser)

    HTML操作是编程中很重要的一块,下面用Python3.x中的html.parser中的HTMLParser类来进行HTML的解析. HTMLParser类定义及常用方法 标准库中的定义 class ...