第八篇 if else语句

欢迎来到Golang教程系列的第八篇

if是一个布尔条件语句,当条件为true时,它执行if程序块的代码,当条件为false时,执行的是else程序块的代码。在这个教程中,我们会看到使用if语句的不同语法和方法。

if语句语法

if语句的语法如下所示:


if condition {
}

如果condition为true, 花括号里的代码将会执行。

跟其它类似C语句的编程语言不一样,花括号{}是必须要有的,即使在花括号{}之间没有一行代码。

例子

让我们写一个简单的例子判读一个数是奇数还是偶数。

package main

import (
	"fmt"
)
func main() {

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

	fmt.Println("The number", num, "is odd")

}

在上面的程序中,条件num%2是获取num除于2的余数是否等于0。在上面的例子中,是等于0,所以打印出The number is even

if else语句

if语句有一个可选的else结构,如果if语句条件为false时,那么它将会执行。

if condition {
} else {
}

上面的片段,如果condition判断为false,那么else{}之间的代码块将会被执行。

让我们写一个程序用if else语句判断一个数是奇数还是偶数

package main

import (
	"fmt"
)

func main() {

	num := 11
	if num%2 == 0 {  //判断结果是否偶数
		fmt.Println("The number", num, "is even")
		return
	}

	fmt.Println("The number", num, "is odd")

}

上面的代码中,condition并不像上一节返回true,我们创建的else语句将会在condition为false时执行。在上面的例子中,因为11是奇数,condition计算返回不为0,则是falseelse语句中的代码将被执行。上面的程序将会输出

The number 11 is odd

if...else if...else语句

if语句还有其它可选部分else ifelse。下面提供了相同的语法。

if condition1 {
...
}else if condition2 {
...
}

条件语句是从上到下进行真值判断。

上面的语句中,如果condition1为真时,那么if condition1 {}之间的代码将会执行。

如果condition1falsecondition2true时,else if condition2 {}之间的代码将被执行。

如果condition1condition2都为false时,那么最后一行的else{}之间的代码将被执行。

else if可以有多个的。

一般地,无论ifelse if的条件语句为真时,其相应的代码块就会执行。如果所有条件语句都为空,那么else代码块就被执行

让我们用else if写一段代码。


package main

import (
	"fmt"
)

func main() {

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

}

在上面的程序中,条件else if num >= 51 && num <= 100true,所以程序将会输出

99 is between 51 and 100

带有赋值的if

还有一种if包含了可选的简短赋值语句,它是在判断条件语句之前执行的。它的语法如下:

if assigment-statement; condition {
}

在上面的片段中, assigment-statement是在判断语句之前执行的。

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

package main

import (
	"fmt"
)

func main() {

	if num := 10; num % 2 == 0 {
		fmt.Println(num,"是偶数")
	} else {
		fmt.Println(num,"是奇数")
	}

}

在上面的程序中,num是在if语句中初始化。有一件事需要注意的是num是一个变量,但只能在ifelse之间访问,也就是说num的限制范围是if``else模块。如果我们想要在if``else之外的地址访问num,编译就会报错。这个语法在if else结构中使用声明变量时非常便利。使用这个语法,要确保变量的范围要在if else语句之内。

Gotcha

else语句应该放在if语句结束花括号的同一行,否则编译时就会报错。

让我们通过下面的程序来说明。

package main

import (
	"fmt"
)

func main() {

	if num := 10; num % 2 == 0 {
		fmt.Println(num,"是偶数")
	} 
	else {
		fmt.Println(num,"是奇数")
	}

}

上面的程序中,else语句并没有跟if语句的结束花括号同一行,而是在另外一行开始。这在Go中是不允许的。如果你运行程序,编译器就会抛出错误。

./main.go:12:2: syntax error: unexpected else, expecting }

原因是因为Go会自动插入分号。你可以了解更多分号插入规则这里: https://golang.org/ref/spec#Semicolons.

在规则里,会在终止大括号}后面插入分号.如果它是一行最后的标记,那么Go编译器会自动在if语句的终止大括号}后面插入分号。

所以我们的程序就会变成这样。


	...
	if num%2 == 0 {
		fmt.Println("the number is even")
	}; // go编译器会自动插入分号
	else {
		fmt.Println("the number is odd")
	}

上面的片段中,编译器会在if的终止大括号后面加上分号。

因为if{...} else {...}是一个语句,一个分号不应该出现在它们中间。因此,这个程序会编译失败。所以,把else放在与if的终止大括号}同一行是语法需要。

下面的程序就是正常的,else紧跟着if的终止大括号}

package main

import (
	"fmt"
)

func main() {

	if num := 10; num % 2 == 0 {
		fmt.Println(num,"是偶数")
	}else {
		fmt.Println(num,"是奇数")
	}

}

上面的程序就会正常编译。

在Go中的习惯

我们已经看到了if-else的不同结构。实际上,我们有多种不同的方法来写同样的程序。例如,我们已经看到了有多种方法用if else来写一个程序检查一个数是奇数还是偶数。哪一种是在Go中比较惯用的呢?
在Go的哲学体系,最好的就要避免不必要的分支和代码依赖,尽早返回数据,下面我提供了上一节的程序。


package main

import (
	"fmt"
)

func main() {

	if num := 10; num % 2 == 0 {
		fmt.Println(num,"是偶数")
	}else {
		fmt.Println(num,"是奇数")
	}

}

在Go的哲学中,惯用的方法是避免else,尽量在在if条件为真时返回。

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程序时,随时都要留意这一点。

以上就是本篇的全部,感谢阅读,这是我第一次翻译,难免会有翻译不当的地方,如果有什么反馈和评论,欢迎提出来!

原文地址: https://golangbot.com/if-statement/