本节重点:
- 学会使用 For,if,swich 等循环判断语句
在编写 Go 程序的时候,我们不仅会用前面学到的数据结构来存储数据,还会用到 if
、switch
、for
来进行条件判断和流程控制,今天我们就来一起学习下它们。
for
循环语句用于重复执行一段代码。
for
是 Go 中唯一可用的循环。Go 没有其他语言(如 C)中存在的 while 或 do while 循环。
for initialisation; condition; post {
}
初始化语句将只执行一次。循环初始化后,将检查条件。如果条件评估为真,则将执行内部循环的主体{ }
,然后执行 post 语句。post 语句将在循环的每次成功迭代后执行。post语句执行后,条件会被重新检查。如果为真,循环将继续执行,否则 for 循环终止。
在 Go 中,初始化、条件和发布这三个组件都是可选的。让我们看一个例子来更好地理解 for 循环。
让我们编写一个程序,使用 for 循环打印从 1 到 10 的所有数字。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
fmt.Printf(" %d",i)
}
}
在上面的程序中,i
被初始化为 1。条件语句将检查 if i <= 10
。如果条件为真,则打印 i
的值,否则终止循环。post 语句在每次迭代结束时将i
递增 1。一旦i
大于 10,循环终止。
上面的程序将打印1 2 3 4 5 6 7 8 9 10
在 for 循环中声明的变量仅在循环范围内可用。因此i
不能在 for 循环体之外访问。
break语句
该break
语句用于在 for 循环完成正常执行之前突然终止 for 循环,并将控件移动到 for 循环之后的代码行。
让我们编写一个程序,使用 break 打印从 1 到 5 的数字。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i > 5 {
break // 如果 i > 5 就跳出
}
fmt.Printf("%d ", i)
}
fmt.Printf("\nline after for loop")
}
在上面的程序中,每次迭代都会检查 i 的值。如果 i 大于 5 则break
执行并终止循环。然后执行 for 循环之后的 print 语句。上面的程序会输出,
1 2 3 4 5
line after for loop
continue
该continue
语句用于跳过 for 循环的当前迭代。在 continue 语句之后出现在 for 循环中的所有代码都不会在当前迭代中执行。循环将继续进行下一次迭代。
让我们编写一个程序,使用 continue 打印从 1 到 10 的所有奇数。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue
}
fmt.Printf("%d ", i)
}
}
在上面的程序中,该行if i%2 == 0
检查 i 除以 2 的余数是否为 0。如果为零,则数字为偶数,continue
执行语句,控制移至循环的下一次迭代。因此,将不会调用 continue 之后的 print 语句,并且循环继续进行下一次迭代。上述程序的输出是1 3 5 7 9
注意:
break
会结束所有循环。continue
会跳过当前循环直接进入下一次循环。
if else 语句
if
是一个具有布尔条件的语句,如果该条件的计算结果为真 ,它将执行一段代码true。如果条件评估为 ,它会执行一个备用的 else 块false。在本教程中,我们将了解使用 if
语句的各种语法和方法。
if
是一个具有布尔条件的语句,如果该条件为真,则执行第一个代码块。如果条件求值为false
,则执行另一个else
块。在本教程中,我们将学习if
语句的各种语法和使用方法。
if
主要用于条件判断,语法为:
if 条件 {
# 业务代码
}
先看一个简单例子:
package main
import "fmt"
func main() {
age := 7
if age > 6 {
fmt.Println("good")
}
}
在上面的程序中,第8行age > 6
为条件,求age
是否大于 6。如果是,将打印good
文本并且返回程序。
我们可以在条件中使用 &
或 ||
来进行组合判断:
package main
import "fmt"
func main() {
age := 7
if age > 6 && age <= 12 {
fmt.Println("It's primary school")
}
}
我们还可以使用 if
…else if
…else
来实现多分支的条件判断:
package main
import "fmt"
func main() {
age := 13
if age > 6 && age <= 12 {
fmt.Println("It's primary school")
} else if age > 12 && age <= 15 {
fmt.Println("It's middle school")
} else {
fmt.Println("It's high school")
}
}
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
语句返回条件为真
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")
}
switch
switch 是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较并执行相应的代码块。它可以被认为是替换复杂if else
从句的惯用方式。 例如:
package main
import "fmt"
func main() {
age := 10
switch age {
case 5:
fmt.Println("The age is 5")
case 7:
fmt.Println("The age is 7")
case 10:
fmt.Println("The age is 10")
default:
fmt.Println("The age is unkown")
}
}
注意:在 Go 中 switch
只要匹配中了就会中止剩余的匹配项,这和 Java
很大不一样,它需要使用 break
来主动跳出。
switch
的 case
条件可以是多个值,例如:
package main
import "fmt"
func main() {
age := 7
switch age {
case 7, 8, 9, 10, 11, 12:
fmt.Println("It's primary school")
case 13, 14, 15:
fmt.Println("It's middle school")
case 16, 17, 18:
fmt.Println("It's high school")
default:
fmt.Println("The age is unkown")
}
}
注意: 同一个 case 中的多值不能重复。
switch
还可以使用 if..else
作为 case
条件,例如:
package main
import "fmt"
func main() {
age := 7
switch {
case age >= 6 && age <= 12:
fmt.Println("It's primary school")
case age >= 13 && age <= 15:
fmt.Println("It's middle school")
case age >= 16 && age <= 18:
fmt.Println("It's high school")
default:
fmt.Println("The age is unkown")
}
}
小技巧: 使用 switch
对 interface{}
进行断言,例如:
package main
import "fmt"
func checkType(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("%v is an in\n", v)
case string:
fmt.Printf("%v is a string\n", v)
default:
fmt.Printf("%v's type is unkown\n", v)
}
}
func main() {
checkType(8)
checkType("hello, world")
}