欢迎阅读我们的 Golang 系列教程第八篇。

if 是一个有布尔条件的语句,如果该条件值为真,则执行一个代码块。如果条件值为 false,则执行另一个 else 块。在本教程中,我们将了解 if 语句的各种语法和使用方法。

If 语句语法

下面提供了 if 语句的语法

  1. if condition {
  2. }

如果 condition 为真,则执行 { 和 } 之间的代码。

与 C 这种其他语言不同,即使大括号 { } 里只有一条语句,大括号 { } 也是强制性要写上的。

例子

让我们编写一个简单的程序来找出数字是偶数还是奇数。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 10
  7. if num%2 == 0 { //checks if number is even
  8. fmt.Println("The number", num, "is even")
  9. return
  10. }
  11. fmt.Println("The number", num, "is odd")
  12. }

Run in Playground

在上面的程序中,第 9 行中的条件 num%2 是为了确定 num 除以 2 的余数是否为零。因为在这种情况下是 0,所以打印出 The number 10 is even,程序返回。

If else 语句

if 语句有一个可选的 else 构造,如果 if 语句中的条件值为 false,则会被执行。

  1. if condition {
  2. } else {
  3. }

在上面的代码段中,如果 condition 值为 false,那么将执行 else { 和 } 之间的代码行。

让我们重写程序,使用 if else 语句查找这个数字是奇数还是偶数。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 11
  7. if num%2 == 0 { //checks if number is even
  8. fmt.Println("the number", num, "is even")
  9. } else {
  10. fmt.Println("the number", num, "is odd")
  11. }
  12. }

Run in playground

在上面的代码中,我们没有像上一节那样,如果条件为 true 就返回,而是创建了一个 else 语句,如果条件为 false 就执行。在这种情况下,由于 11 是奇数,所以 if 条件为 false,并且执行 else 语句内的代码行。上面的程序将打印。

  1. the number 11 is odd


If … else if … else 语句

if 语句也有可选的 else if 和 else 组件。同样的语法如下

  1. if condition1 {
  2. ...
  3. } else if condition2 {
  4. ...
  5. } else {
  6. ...
  7. }

从上到下对条件进行判断真假。

在上面的语句中,如果 condition1 为真,那么 if condition1 { 和收尾括号 } 内的代码行将被执行。

如果 condition1 为 false,condition2 为 true,则执行 else if condition2 { 和下一个结束括号 } 内的代码行。

如果 condition1 和 condition2 都是 false,则执行 else { 和 } 之间的 else 语句中的代码行。

else if 语句可以有任意多条。

一般来说,无论哪个 ifelse if 的条件评价为 true,它对应的代码块都会被执行。如果条件都不为真,那么就会执行 else 块。

让我们写一个使用 else if 的程序。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 99
  7. if num <= 50 {
  8. fmt.Println(num, "is less than or equal to 50")
  9. } else if num >= 51 && num <= 100 {
  10. fmt.Println(num, "is between 51 and 100")
  11. } else {
  12. fmt.Println(num, "is greater than 100")
  13. }
  14. }

Run in playground

在上面的程序中,第 11 行的 else if num >= 51 && num <= 100 的条件为 true,因此程序将打印

  1. 99 is between 51 and 100


If with assignment

if 还有一个变体,它包括一个可选的简短赋值语句,在条件被评估之前执行。它的语法是

  1. if assignment-statement; condition {
  2. }

在上面的代码段中,在评估条件之前,首先执行 assignment-statement。

让我们用上面的语法重写程序,找出数字是偶数还是奇数。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. if num := 10; num % 2 == 0 { //checks if number is even
  7. fmt.Println(num,"is even")
  8. } else {
  9. fmt.Println(num,"is odd")
  10. }
  11. }

Run in playground

在上面的程序中,num 是在第 8 行的 if 语句中初始化的。需要注意的是,num 只能在 ifelse 中访问,也就是说,num 的范围仅限于 if else 中。如果我们试图从 ifelse 范围之外访问 num,编译器会报错。当我们声明一个变量只是为了 if else 结构的目的时,这种语法往往很方便。在这种情况下使用这种语法可以确保变量的范围只在 if else 语句中。

Gotcha

else 语句必须在if语句的右大括号 } 之后的同一行开始。如果不是,编译器会报错。

让我们通过一个程序来理解这一点。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 10
  7. if num % 2 == 0 { //checks if number is even
  8. fmt.Println("the number is even")
  9. }
  10. else {
  11. fmt.Println("the number is odd")
  12. }
  13. }

Run in playground

在上面的程序中,else 语句不会在 11 行 if 语句的右大括号 } 后的同一行中开始。相反,它从下一行开始。 但 Go 不允许这样做。如果运行此程序,编译器将输出错误

  1. main.go:12:5: syntax error: unexpected else, expecting }

原因是Go会自动插入分号。你可以在此处阅读有关分号插入规则的信息https://golang.org/ref/spec#Semicolons

如果这是该行的最后一个标记,Go 会指定在 } 之后插入分号。因此,在 11 行 if 语句的 } 之后会自动插入分号。

所以我们的代码实际上是这样

  1. if num%2 == 0 {
  2. fmt.Println("the number is even")
  3. }; //semicolon inserted by Go
  4. else {
  5. fmt.Println("the number is odd")
  6. }

编译器会在上述代码的第 4 行插入一个分号。

因为 if{...} else {...} 是一个单独的语句,分号不应该出现在它的中间。因此这个程序无法编译。因此,将 else 放在 if 语句的结尾括号 } 之后的同一行中是一个语法要求。

我重写了程序,在 if 语句结束 } 后面移动了else,以防止自动插入分号。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 10
  7. if num%2 == 0 { //checks if number is even
  8. fmt.Println("the number is even")
  9. } else {
  10. fmt.Println("the number is odd")
  11. }
  12. }

Run in playground

现在就运行正常了

Go 常用写法

我们见过各种 if-else 构造,其实我们也见过多种方法来写同一个程序。例如,我们看到了用不同的 if else 构造来写一个检查数字是偶数还是奇数的程序的多种方法。哪一种才是 Go 中的常用的编码方式呢?在 Go 的理念中,最好避免不必要的分支和代码缩进。同时也认为尽可能早的返回比较好。下面我提供了上一节的程序。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. if num := 10; num % 2 == 0 { //checks if number is even
  7. fmt.Println(num,"is even")
  8. } else {
  9. fmt.Println(num,"is odd")
  10. }
  11. }

Run in playground

在 Go 的哲学中,上述程序的惯用写法是:如果条件为真,则避开 else,从 if 中返回。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 10;
  7. if num%2 == 0 { //checks if number is even
  8. fmt.Println(num, "is even")
  9. return
  10. }
  11. fmt.Println(num, "is odd")
  12. }

Run in playground

在上面的程序中,一旦发现数字是偶数,我们就立即返回。这样就避免了不必要的 else 代码分支。这就是 Go 😃 中的做法。请大家在编写 Go 程序的时候记住这一点。

原文链接

https://golangbot.com/if-statement/