点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,掌握 Go 语言
你好,我是四哥。
上篇文章我们学习了包的用法,这篇文章来学习 if-else 语句。
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 { //checks if number is even
fmt.Println("The number", num, "is even")
return
}
fmt.Println("The number", num, "is odd")
}
执行[1]
上面代码第 9 行 num%2 判断 num 除以 2 余数是否为 0,因为 num 次数偶数,所以余数为 0,程序输出 The number 10 is even。
if-else 语句
if 语句有对应的 else 分支,如果 condition 结果为 false,则会执行 else 分支。
if condition {
} else {
}
在上面的代码,如果 condition 结果为 false,则 else 分支 {} 之间的代码行将被执行。
让我们使用 if-else 语句重写程序来判断数字是奇数还是偶数。
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")
}
}
执行[2]
上面的代码中,我们没有在条件为 true 时直接返回,而是创建了 else 语句,当条件为 false 时,将执行该语句。在我们这个 case 中,由于 11 是奇数,因此 if 条件为 false,所以会执行 else 语句中的代码。
上面代码执行输出:
the number 11 is odd
if-else if-else 语句
if 语句不仅有 else 分支,还可以有 else-if 分支,语法如下:
if condition1 {
...
} else if condition2 {
...
} else {
...
}
代码执行时会从上之下判断每个分支的 condition 是否为 true。
上面的代码,如果 condition1 为 true,将会执行 condition1 后面 {} 之间的代码;
如果 condition1 为 false 且 condition2 为 true,则会执行 condition2 后面 {} 之间的代码;
如果 condition1 和 condition2 都为 false,则会执行 else 后面 {} 之间的代码。
可以有任意数量的 else-if 语句块。
通常,只要 if 和 else-if 语句有一个 condition 为 true,就会执行相应的代码块,如果没有为 true 的情况则会执行 else 分支的代码。
我们使用 else-if 语句编写一段程序:
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")
}
}
执行[3]
上面的代码,else if num >= 51 && num <= 100 条件为 true,所以执行输出:
99 is between 51 and 100
if 包含初始化语句
if 语句的一种变体是在判断条件之前,可以有短变量声明语句,语法如下:
if assignment-statement; condition {
}
上面的代码片段,短变量声明语句会优先执行。
我们用上面的语法重写代码来判断数字是偶数还是奇数。
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")
}
}
执行[4]
上面代码第 8 行,变量 num 在 if 语句中被初始化,
需要注意的是,num 的作用域仅限于 if-else 语句块内,即如果我们在 if-else 之外访问 num,编译器将会报错。
当我们仅仅想声明一个只在 if-else 内部使用的变量时,这种语法就可以派上用场,可确保变量的作用范围仅在 if-else 语句内。
坑
else 语句应该在 if 语句的右大括号 } 之后的同一行开始。如果不是,会编译报错。
写一小段程序理解下:
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")
}
}
执行[5]
上面代码的第 11 行,else 语句没有紧跟着 if 语句的 } 后面 ,相反,它是另起新的一行开始。如果你执行程序编译器将会报错。
./prog.go:12:5: syntax error: unexpected else, expecting }
报错的原因在于 Go 会自动插入分号,关于插入分号的规则可以点击这里[6]查看更多信息。
其中有一项规则,如果一行代码以 } 结束,则会在 } 后面自动加上分号,所以上面代码第 11 行,会被编译器在 } 后面自动加上分号。
我们的代码就变成了:
...
if num%2 == 0 {
fmt.Println("the number is even")
}; //semicolon inserted by Go Compiler
else {
fmt.Println("the number is odd")
}
由于 if-else 是一个独立的语句,中间不应出现分号,因此,程序编译会报错。因此,将 else 紧跟在 if 语句的右大括号 } 之后是语法要求。
正确格式的代码如下:
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")
}
}
执行[7]
Go 里的习惯用法
我们已经学习了各种 if-else 语句,针对同一功能可以用这些不同语句编写出不同的实现方法。例如,我们使用 if-else 语句及其变体实现了不同的方式去判断一个数字是奇数还是偶数。你可能会问,哪种方式才是 Go 语言常用的方式呢?
在 Go 的设计哲学中,最好避免不必要的分支和代码缩进。执行时尽早返回也被认为是更好的。
再来展示下之前的代码:
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,则应尽早执行 return 返回。
就像下面这样:
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")
}
执行[8]
在上面代码中,一旦我们发现数字是偶数,就立即返回,就避免了不必要的 else 分支。这就是 Go 语言的哲学 -- “大道至简”,尽量追求代码简洁。
编写代码时务必牢记这点!
via: https://golangbot.com/if-statement/
作者:Naveen R
参考资料
[1]
执行: https://play.golang.org/p/RRxkgK07ul4
[2]执行: https://play.golang.org/p/bMevwhJhguO
[3]执行: https://play.golang.org/p/VNPbCiK9eXT
[4]执行: https://play.golang.org/p/_X9q4MWr4s
[5]执行: https://play.golang.org/p/RYNqZZO2F9
[6]这里: https://golang.org/ref/spec#Semicolons
[7]执行: https://play.golang.org/p/hv_27vbIBC
[8]执行: https://play.golang.org/p/N8A5tPLnVYr
推荐阅读:
资料下载
点击下方卡片关注公众号,发送特定关键字获取对应精品资料!
回复「电子书」,获取入门、进阶 Go 语言必看书籍。
回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!
回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。
回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。
回复「后台」,获取后台开发必看 10 本书籍。
对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇
这是持续翻译的第 33/100 篇优质文章。
如果你有想交流的话题,欢迎留言。
如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!