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

Golang

程序必须是为了供人阅读而编写的,只是附带让机器执行。— Harold Abelson

✱ If/else 条件语句

Go 提供了我们熟悉的 if/else 语句的 ifif-elseif-**else if**-else 变体。它用于检查条件,并在条件为 truefalse 时执行一些代码。

☛ 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/@thatisuday/anatomy-o...

译文地址:https://learnku.com/go/t/36140

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 1
wangchunbo

这个翻译很多,而且简单,大家快来一起翻译呀!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!