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 行的if8语句中num进行了初始化。.需要注意的一点是,num它只能从if和else内部访问。即范围num仅限于if else块。如果我们尝试从iforelse外部访问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 程序时牢记这一点。