5.4.1. Select语句 Go语言的select语句语法如下:
1 2 3 4 5 6 | select { case sendOrReceive1: block1 ... case sendOrReceiveN: blockN default: blockD } |
在select语句中Go语言会按顺序评估每一个发送和接收语句,如果任何语句可以继续进行(即没有被阻塞),则任意选择这些语句中一个来执行;如果没有可以继续执行的语句(…
5.4.1. Select语句 Go语言的select语句语法如下:
1 2 3 4 5 6 | select { case sendOrReceive1: block1 ... case sendOrReceiveN: blockN default: blockD } |
在select语句中Go语言会按顺序评估每一个发送和接收语句,如果任何语句可以继续进行(即没有被阻塞),则任意选择这些语句中一个来执行;如果没有可以继续执行的语句(…
5.3. for循环语句 Go语言支持两种for循环语句,for和for…range语句。语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | for { // Infinite loop block } for booleanExpression { // While loop block } for optionalPreStatement; booleanExpression; optionalPostStatement { block } for index, char := range aString { // String per character iteration block } for index := range aString { // String per character iteration block // char, size := utf8.DecodeRuneInString(aString[index:]) } for index, item := range anArrayOrSlice { // Array or slice iteration block } for index := range anArrayOrSlice { // Array or slice iteration block // item := anArrayOrSlice[index] } for key, value := range aMap { // Map iteration block } for key := range aMap { // Map iteration block // value := aMap[key] } for item := range aChannel { // Channel iteration block } |
大括号是必需的,但是分号只有在可选的optionalPreStatement或optionalPostStatement语句存在时才…
5.2.2.2. 类型开关 之前我们讲解过类型断言,当使用interface{}类型的变量时,我们常常需要访问其底层数据。如果我们知道其类型,我们就可以使用类型断言,但是如果其类型可能是多种类型中的一种,我们就可以使用类型开关语句。 Go语言的类型开关语法如下: [crayon-67b7817209…
5.2.2.1. 表达式开关 Go语言的表达式开关语法如下:
1 2 3 4 5 6 | switch optionalStatement; optionalExpression { case expressionList1: block1 ... case expressionListN: blockN default: blockD } |
如果使用了可选声明,则分号是必需的,而不管其中是否使用了可选表达式。每个case块都由零个或多个语句组成。 如果switch语句中没有任何可选表达式,则编译器会假定表达式的…
5.2.2. switch语句 Go语言提供了两种类型的switch语句:表达式开关和类型开关。表达式开关与C、C++和Java语言中的类似,而类型开关是Go语言所特有的。这两种开关在语法上非常相似,但与C、C++和Java不同的是,Go语言的switch语句不会自动向下贯通(所以无需在每个case…
5.2.1. if语句 Go语言的if语句语法如下:
1 2 3 4 5 6 7 | if optionalStatement1; booleanExpression1 { block1 } else if optionalStatement2; booleanExpression2 { block2 } else { block3 } |
在一个if语句块中可能含有零个或多个elseif子句,以及零个或一个else子句,而每个子句中又由多个语句组成。 If中的大括号是必需的,但是分号只有在使用可选声明的情况下才需要。…
5.2.分支 Go语言支持3种分支:if、switch和select。我们也可以通过使用映射来实现分支功能,其中该映射的键用于选择分支,而值是对应的要调用的函数,稍后我们会详细介绍。 目录 作者:Johnson 原文:Go语言开发-过程式编程-分支 出处:青梅酒博客 – Plum Win…
5.1.2.类型断言 一个类型的方法集是指可以被该类型的值调用的所有方法的集合,对于没有方法的类型来数该集合为空。Go语言的interface{}类型用于表示空接口,即一个含有空集的方法集的类型的值。因为每个类型都有一个包含空集的方法集(不论其拥有多少方法),一个interface{}可以用于表示一…
3.7. 例子: M3u2pls 在本节中,我们将简单介绍一个短小但完整的程序,该程序从命令行中读取给定的后缀名为 .m3u的音乐播放列表文件并输出一个等效的.pls播放列表文件。程序中使用了很多strings包中的函数,同时也讲解了一些新的知识。 下面是从.m3u文件中摘抄出的一些内容,中间使用省…
3.6.5. regexp包 本小节给出了一些表,这些表列出了regexp包里的函数和支持的正则表达式语法,同时也给出了几个例子。在本小节或本书的其他地方也会使用到正则表达式,我们假设读者已经具有了一些正则表达式基础。 regexp包是Russ Cox的RE2正则表达式引擎的Go语言实现,该引擎速度…
3.6.4. unicode包 unicode包提供了一些用来查询unicode码点以确定其是否符合某些标准的函数,例如,一个字符是否可以表示成一个数字或一个小写字母。表3.11列出了一些最常用的函数。除了那些我们期望的函数外,如unicode.ToLower() 和unicode.IsUpper(…
3.6.2. strconv包
strconv包提供了许多用于将字符串和其他类型相互转换的函数。表3.8和表3.9(也可以参考fmt包的打印和扫描函数)列出了这些函数。接下来让我们看几个例子。一个常见的需求是将字符串表示的值转换为布尔值。我们可以使用 strconv.ParseBool() 函数来实现。
3.6.1. strings包
在字符串处理中一个常见的需求是能够将字符串切分为字符串切片,然后再做进一步的处理,例如,将字符串转换为数字或去除字符串前后的空格。为了学习如何使用strings包中的函数,我们将通过一些简单的例子来使用这些函数。表3.6和表3.7列出了strings包中所有的函数。首先让我们以切分字符串开始。
3.6.其他字符串相关的包
Go语言对字符串的强大支持并不局限于索引和切片,也不局限于fmt包中丰富的函数。strings包提供了非常丰富的功能,strconv、unicode/utf8和unicode包也提供了大量的非常有用的函数。稍后我们将介绍regexp包中的正则表达式