if-else语句
Q7nl1s admin

if是一个具有布尔条件的语句,如果该条件的计算结果为 ,它将执行一段代码true。如果条件评估为false,它会执行一个备用的 else 块。在本教程中,我们将了解使用 if 语句的各种语法和方法。

if语句语法

if语句的语法如下所示

1
2
if condition {  
}

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

与 C 等其他语言不同,大括号{ }是强制性的,即使大括号{ }之间只有一行代码。

例子

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
)

func main() {
num := 10
if num%2 == 0 { //checks if number is even
fmt.Println("The number", num, "is even")
return
}
fmt.Println("The number", num, "is odd")
}

在上面的程序中,第 9行中的条件num%2==0num除以2的余数是否为零。由于结果为0,在这种情况下,文本The number 10 is even被打印并且程序return。

if else语句

if语句有一个可选的else构造,如果语句中的条件计算为flase,则该构造将被执行。

1
2
3
if condition {  
} else {
}

在上面的代码片段中,如果condition计算结果为false,则 else {}之间的代码行将被执行。

让我们通过if else语句重写程序来查找数字是奇数还是偶数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
)

func main() {
num := 11
if num%2 == 0 { //checks if number is even
fmt.Println("the number", num, "is even")
} else {
fmt.Println("the number", num, "is odd")
}
}

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

1
the number 11 is odd  

if … else if … else 语句

if 语句也有可选的else ifelse组件。下面提供了相同的语法

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

从上到下评估条件是否为真。

在上述语句中,如果condition1为真,则执行if condition1 {和右大括号}中的代码。

如果 condition1falsecondition2为真,则执行else if condition2 {和下一个右大括号}中的代码。

如果condition1condition2都为假,则执行else {}之间的语句中的代码。

可以有任意数量的else if语句。

通常,无论ifelse if的条件评估为true,它对应的代码块都会被执行。 如果没有一个条件为真,则else执行块。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
)

func main() {
num := 99
if num <= 50 {
fmt.Println(num, "is less than or equal to 50")
} else if num >= 51 && num <= 100 {
fmt.Println(num, "is between 51 and 100")
} else {
fmt.Println(num, "is greater than 100")
}
}

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

1
99 is between 51 and 100  

If with assignment

if还有一个变体包括一个可选的速记赋值语句(shorthand assignment),该语句在评估条件之前执行。它的语法是

1
2
if assignment-statement; condition {  
}

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

让我们用上面的语法重写程序来判断数字是偶数还是奇数。

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"
)

func main() {
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
}

在上面的程序中,在第 8 行的if8语句中num进行了初始化。.需要注意的一点是,num它只能从ifelse内部访问。即范围num仅限于if else块。如果我们尝试从iforelse外部访问num,编译器会报错。当我们仅仅为了构造目的而声明一个变量时,这种语法通常会派上用场。在这种情况下使用此语法可确保变量的范围仅在if else语句内。

Gotcha

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
)

func main() {
num := 10
if num % 2 == 0 { //checks if number is even
fmt.Println("the number is even")
}
else {
fmt.Println("the number is odd")
}
}

在上面的程序中,在第 11 行的 if 语句结束后,else语句和}不在同一行开始。相反,else从下一行开始。这在 Go 中是不允许的。如果你运行这个程序,编译器会报错:

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

原因在于 Go 自动插入分号的方式。您可以在https://golang.org/ref/spec#Semicolons阅读有关分号插入规则的信息。

在规则中,如果分号}是该行的最后一个标记,则指定在右大括号之后插入一个分号。因此,分号会自动插入到第 11行 if 语句的右大括号}之后。 由 Go 编译器编写。

所以我们的程序实际上变成了

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

编译器会在第 4 行末尾插入一个分号。

由于if{...} else {...}是单个语句,因此中间不应出现分号。因此,该程序无法编译。因此,将 if 语句的右大括号}else放在同一行中是一种语法要求。

我通过在 if 语句的结束标志}后移动 else 来重写程序,以防止自动插入分号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
)

func main() {
num := 10
if num%2 == 0 { //checks if number is even
fmt.Println("the number is even")
} else {
fmt.Println("the number is odd")
}
}

如此编译器会很高兴,我们也会很高兴😃。

Idiomatic Go

我们已经看到了各种 if-else 结构,实际上我们已经看到了编写同一个程序的多种方法。例如,我们已经看到了多种编写程序的方法,该程序使用不同的if else结构检查数字是偶数还是奇数。哪一种是 Go 中惯用的编码方式?在 Go 的理念中,最好避免不必要的分支和代码缩进。尽早返回也被认为是更好的。我在下面提供了上一节中的程序,

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"
)

func main() {
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
}

在 Go 的理念中编写上述程序的惯用方式是避免使用 else 并从 if 条件为 true 的情况下返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
)

func main() {
num := 10;
if num%2 == 0 { //checks if number is even
fmt.Println(num, "is even")
return
}
fmt.Println(num, "is odd")

}

在上面的程序中,一旦我们发现数字是偶数,我们立即返回。这避免了不必要的 else 代码分支。这就是 Go 中的工作方式😃。请在编写 Go 程序时牢记这一点。

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View