if
是一个具有布尔条件的语句,如果该条件的计算结果为 ,它将执行一段代码true
。如果条件评估为false
,它会执行一个备用的 else 块。在本教程中,我们将了解使用 if 语句的各种语法和方法。
if语句语法
if
语句的语法如下所示
1 | if condition { |
如果condition
为真,则执行大括号{
和}
之间的代码行。
与 C 等其他语言不同,大括号{ }
是强制性的,即使大括号{ }
之间只有一行代码。
例子
让我们编写一个简单的程序来找出一个数字是偶数还是奇数。
1 | package main |
在上面的程序中,第 9行中的条件num%2==0
求num
除以2
的余数是否为零。由于结果为0
,在这种情况下,文本The number 10 is even
被打印并且程序return。
if else语句
该if
语句有一个可选的else
构造,如果语句中的条件计算为flase
,则该构造将被执行。
1 | if condition { |
在上面的代码片段中,如果condition
计算结果为false
,则 else {
和 }
之间的代码行将被执行。
让我们通过if else
语句重写程序来查找数字是奇数还是偶数。
1 | package main |
在上面的代码中,true
我们没有像上一节那样返回 if 条件,而是创建了一个else
语句,如果条件是 false
,则将执行该语句。在这种情况下,因为11
是奇数,if 条件是false
所以else
语句中的代码行被执行。上面的程序将打印
1 | the number 11 is odd |
if … else if … else 语句
if 语句也有可选的else if
和else
组件。下面提供了相同的语法
1 | if condition1 { |
从上到下评估条件是否为真。
在上述语句中,如果condition1
为真,则执行if condition1 {
和右大括号}
中的代码。
如果 condition1
是false
且condition2
为真,则执行else if condition2 {
和下一个右大括号}
中的代码。
如果condition1
和condition2
都为假,则执行else {
和 }
之间的语句中的代码。
可以有任意数量的else if
语句。
通常,无论if
或else if
的条件评估为true
,它对应的代码块都会被执行。 如果没有一个条件为真,则else
执行块。
让我们编写一个使用else if
的程序
1 | package main |
在上面的程序中,第 11行中的条件else if num >= 51 && num <= 100
是true
,因此程序将打印
1 | 99 is between 51 and 100 |
If with assignment
if
还有一个变体包括一个可选的速记赋值语句(shorthand assignment),该语句在评估条件之前执行。它的语法是
1 | if assignment-statement; condition { |
在上面的代码片段中,assignment-statement
在评估条件之前首先执行。
让我们用上面的语法重写程序来判断数字是偶数还是奇数。
1 | package main |
在上面的程序中,在第 8 行的if
8语句中num
进行了初始化。.需要注意的一点是,num
它只能从if
和else
内部访问。即范围num
仅限于if
else
块。如果我们尝试从if
orelse
外部访问num
,编译器会报错。当我们仅仅为了构造目的而声明一个变量时,这种语法通常会派上用场。在这种情况下使用此语法可确保变量的范围仅在if else
语句内。
Gotcha
语句else
应在 if 的右花括号}
之后的同一行开始。如果不是,编译器会报错。
让我们通过一个程序来理解这一点。
1 | package main |
在上面的程序中,在第 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 | ... |
编译器会在第 4 行末尾插入一个分号。
由于if{...} else {...}
是单个语句,因此中间不应出现分号。因此,该程序无法编译。因此,将 if 语句的右大括号}
与else
放在同一行中是一种语法要求。
我通过在 if 语句的结束标志}
后移动 else 来重写程序,以防止自动插入分号。
1 | package main |
如此编译器会很高兴,我们也会很高兴😃。
Idiomatic Go
我们已经看到了各种 if-else 结构,实际上我们已经看到了编写同一个程序的多种方法。例如,我们已经看到了多种编写程序的方法,该程序使用不同的if else
结构检查数字是偶数还是奇数。哪一种是 Go 中惯用的编码方式?在 Go 的理念中,最好避免不必要的分支和代码缩进。尽早返回也被认为是更好的。我在下面提供了上一节中的程序,
1 | package main |
在 Go 的理念中编写上述程序的惯用方式是避免使用 else 并从 if 条件为 true 的情况下返回。
1 | package main |
在上面的程序中,一旦我们发现数字是偶数,我们立即返回。这避免了不必要的 else 代码分支。这就是 Go 中的工作方式😃。请在编写 Go 程序时牢记这一点。