Go 语言基础 - if-else

Go语言进阶学习

共 1760字,需浏览 4分钟

 · 2022-04-14

点击上方“Go语言进阶学习”,进行关注

回复“Go语言”即可获赠从入门到进阶共10本电子书

更有明朝恨,离杯惜共传。

你好,我是四哥。

上篇文章我们学习了包的用法,这篇文章来学习 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

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Go学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报