[奔跑的 Go] 教程四、Go 语言中的条件语句和循环(if..else..loop)

程序必须是为了供人阅读而编写的,只是附带让机器执行。— Harold Abelson
✱ If/else 条件语句
Go 提供了我们熟悉的 if/else 语句的 if,if-else,if-**else if**-else 变体。它用于检查条件,并在条件为 true 或 false 时执行一些代码。
☛ if 条件
if 条件的示例如下图。 与大多数程序语言不同, Go 不允许在 () 内写 条件。

https://play.golang.org/p/Tk2iWdJfvM6
不同于
*JavaScript*或者*C*语言,即使在*{...}*中只有一个条件, 也必须使用大括号*{}*。
☛ if - else 条件
在 if-else 条件语句中,如果 if 条件不满足,将会执行 else 代码块。

https://play.golang.org/p/JWN4l7gca0w
需要特别注意的是 else 语句必须和 if 语句的结束大括号 } 在同一行。如果将 else 语句放在新的一行中,Go 将会自动在 if 的结束大括号 } 的后面添加一个 ;,这将会引起编译错误。下面的写法就是典型的错误。
if condition {} // implicit ;
else {}
☛ if — else if — else
else if 用于当你想尝试多种情况时。

https://play.golang.org/p/0QBnYnxDIE0
首先,if 条件将被求值,如果条件为真,则 if 块内的代码将被执行,并且不再求值其他条件。但如果 if 条件不满足,则对每一个 else if 条件进行求值,直到没有条件满足为止。如果没有一个条件满足,else 块将被执行。
☛ 初始语句
可以在 if 条件求值之前执行初始语句。
if statement; condition {
...
}
这可以方便地初始化条件变量,并将该变量的作用域限制为 if-else 块。

https://play.golang.org/p/k0lZ7xpiUrK
选择条件
Go不支持三元运算符,也没有明确的方式来实现类似三元运算符的情况
✱ Switch 条件语句
switch 语句可以用来代替多个if-else条件语句.
☛ switch 语法
switch 需要获取一个输入值,根据输入值在多个case中来寻求匹配项。与C不同的是,Go不需要在每个case代码块上以break来代表语句的结束,而是在case代码块中最后一条语句执行完自动结束。Go不允许有重复的case值.
switch input {
case value_1:
...
case value_1:
...
}
接下来是一个简单的例子:通过手指的序号来找出手指的名字。

https://play.golang.org/p/-7qgbsnG6MH
switch接收变量finger的输入值,找到与finger的值相匹配的case代码块。上面的程序可以看出,当finger == 2的时候, case 2下面的代码块将会被执行,并且打印出 Index.
如果
*finger*的值不在1-5之间,将不会有任何打印输出。
☛ default case
有时候,我们需要使用else来表示不满足所给出条件的情况。同样的在switch中,使用default来代表不匹配所给出的case的情况下要执行的代码块。

https://play.golang.org/p/OUH42meLgrZ
上面的程序表示,由于输入变量finger的值是6,不匹配任何一个case的值,这时候default代码块将会执行,打印出 No fingers matched。
*default*不是必须要放在所有的case之后,可以放在*switch*代码块任何独立的行。
☛ 多个 case 值
你可以使用多个(,)分割的 case 值来匹配输入的 switch 值。

https://play.golang.org/p/G6bJqNytCYU
上面的程序将打印 Letter is a vovel,因为变量 letter 有值 i,它属于 case 值 "a", "e", "i", "o", "u"。
☛ 初始语句
还有另一种 switch 语句,您可以在输入值之前添加初始语句,就像 if 条件语句一样。
switch statement; input {
...
}
让我们看看前面的例子,在本例中,我们将在 switch 语句本身中定义 letter 变量,将其作用域限制为 switch 块。

https://play.golang.org/p/-5ywgULjkmU
☛ 无表达式的 switch
Go 的 switch 语句中的输入值是可选的。当 switch 语句没有输入值时,case 将是一个返回布尔值的表达式。

https://play.golang.org/p/Jwvp2oPPsL-
由于 number 大于20,number > 5 将满足,number is greater than 5 将打印在屏幕上。
我们可以使用初始语句,而不需要输入 switch 语句的值。在上面的程序中,我们可以在 switch 语句中初始化 number 变量。

https://play.golang.org/p/5RPq2LRq5Xw
在初始语句之后必须有一个分号,因为如果我们不添加分号,那么我们的 switch 语句将不再是无表达式的,而number:= getnumber() 将成为无效的输入值表达式。
☛ fallthrough 语句
与通常情况一样,当执行 case 块时,不会尝试其他情况。在上面的程序中,数字大于 5、10 和 15,但是因为 number > 5 和第一个 case 满足这个条件,所以只执行那个 case 块。要执行其他匹配的 case 块,我们使用 fallthrough 语句。

https://play.golang.org/p/2I26lUeyvMk
当一个 case 条件满足并且 case 块被求值,如果编译器找到 fallthrough 语句,下一个 case 块将被求值为相同的条件。fallthrough 应该是一个 case 块中的最后一个语句,否则 go 编译器会抛出 fallthrough statement out of place 的错误。
*fallthrough*语句不允许在最后一个*case*块,因为没有下一步的条件执行
✱ For 循环
不像 C 和其他的编程语言,Go 中唯一可用的循环就是 for 循环。但是 Go 的 for 循环有很多个变体,来针对不通的业务场景。 接下来,我们就看下各种 for 循环。
☛ for循环的语法
for 循环的语法是有三个语句组成的,并且每个语句都是可选的。
for init; condition; post {
...
}
init语句用来初始化condition检查语句 或者post语句中需要用到的所有的变量。当for循环一旦被调用,init语句就被调用。condition语句用来表示for循环执行的条件。 如果condition条件里返回的是true,就会执行for循环体的代码。for循环内的代码执行完一次之后,就会执行post语句中的代码。在post语句中,可以init语句中任何变量的值。在执行完post语句中的代码之后,会执行condition语句。如果condition条件返回的是true, 则继续执行循环体里的代码。否则中断循环。
下面,我们展示一个 demo:

https://play.golang.org/p/yLbkwjoAnAZ
在上面的程序中,将打印出1–6。
☛ for 循环的变体
如前所述,for 循环中的所有三个语句都是可选的。
可选的 post 语句: 我们可以删除 post 语句,并在 for 循环代码中执行,以获得相同的结果。

https://play.golang.org/p/5EIX8Xiec1E
可选的 init 语句: 我们也可以删除 init 语句并在 for 循环外执行。但在本例中,变量 i 将在 for 循环外部可访问。

https://play.golang.org/p/Mb47z3-1vF2
可选的init和post语句: 我们只能使用 条件 检查语句。在这种情况下,可以去掉所有的分号,Go 会把这个语句看作 condition 语句。这就像 C 语言中的 while 循环。

https://play.golang.org/p/-ZNjxR1CiBI
无语句: 由于所有 for 循环语句都是可选的,让我们看看它是如何工作的。没有任何语句的 for 循环是 for 循环, condition 语句始终为真,因此它将无限循环,除非从 for 循环代码中手动终止。

https://play.golang.org/p/ClkdbtaPPy1
上面的代码将输出与前面任何示例相同的结果,但是这一次我们必须使用 break 语句来终止循环,否则编译器将输出所有可能输出的数字。
☛ break 语句
break 语句通常用于中断并跳出 for 循环, break 语句之后的任何语句都不会被执行。

https://play.golang.org/p/Vvl982ZSj45
在上面的范例程序中,当变量 i 大于 6时,if 条件满足并执行了 break 语句,此时将会立即中断并跳出 for 循环
☛ continue 语句
continue 语句用于跳过一个 for 循环迭代。当 for 循环看到 continue 语句时,它只是忽略当前迭代,执行 post 语句,然后重新开始。一个简单的例子是只打印1-10之间的偶数。

https://play.golang.org/p/LWojeN3YT6o
☛ return 语句
若 for 循环遇到 return 语句,函数将停止执行。因此,return 不是 for 循环特有的。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
关于 LearnKu
推荐文章: