目录
if/else
if语句的语法
与c语言不同的是,在Go中,你不需要在条件中使用括号,但是,大括号仍然是必须有的。此外,为了减少行,go语言不支持三目运算符“?:“,因此每次都需要编写完整的if语句。
下面是 if
语句的一个基本示例:
package main
import "fmt"
func main() {
x := 27
if x%2 == 0 {
fmt.Println(x, "is even")
}
}
复合if语句
Go 支持复合 if
语句。 可以使用 else if
语句对语句进行嵌套。 下面是一个示例:
package main
import "fmt"
func givemeanumber() int {
return -1
}
func main() {
if num := givemeanumber(); num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has only one digit")
} else {
fmt.Println(num, "has multiple digits")
}
}
注意:在go语言中,当你在if语句中声明了一个新的变量时,该变量只能在if语句中的任意位置使用,如果在if语句之外使用了该变量,编译器将会报错。
switch case
基本语法
像 if
语句一样,switch
条件不需要括号。 最简单形式的 switch
语句如下所示:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
sec := time.Now().Unix()
rand.Seed(sec)
i := rand.Int31n(10)
switch i {
case 0:
fmt.Print("zero...")
case 1:
fmt.Print("one...")
case 2:
fmt.Print("two...")
default:
fmt.Print("no match...")
}
}
其中的time,rand等是为了产生随机数
使用多个表达式
有时,多个表达式仅与一个 case
语句匹配。 在 Go 中,如果希望 case
语句包含多个表达式,请使用逗号 (,
) 来分隔表达式。 此方法可避免代码重复。
以下代码示例演示了如何包含多个表达式。
package main
import "fmt"
func location(city string) (string, string) {
var region string
var continent string
switch city {
case "Delhi", "Hyderabad", "Mumbai", "Chennai", "Kochi":
region, continent = "India", "Asia"
case "Lafayette", "Louisville", "Boulder":
region, continent = "Colorado", "USA"
case "Irvine", "Los Angeles", "San Diego":
region, continent = "California", "USA"
default:
region, continent = "Unknown", "Unknown"
}
return region, continent
}
func main() {
region, continent := location("Irvine")
fmt.Printf("John works in %s, %s\n", region, continent)
}
请注意,在 case
语句的表达式中包含的值对应于 switch
语句验证的变量的数据类型。 如果包含一个整数值作为新的 case
语句,程序将不会进行编译。
调用函数
在case语句中,还可以将表达式中要匹配的条件设置为函数的返回值
使逻辑进入到下一个case语句
很多人在学完c语言后,对于case语句需要加上break一定印象深刻。
但在 Go 中,当逻辑进入某个 case 时,它会退出 switch
块,除非你显式停止它。 若要使逻辑进入到下一个紧邻的 case,请使用 fallthrough
关键字。
注意:使用该关键字后,跳转到下一个case时不会检验条件是否满足。
for
基本语法
go与c语言的for循环很相似,不过go的for循环表达式像switch一样不需要括号,但依然需要大括号。for的表达式中需要分号来分隔。
空的预处理语句和后处理语句
在c语言中,可以使用 while
关键字编写循环模式,在这些模式中,只有条件表达式是必需的。 Go 没有 while
关键字。 但是,你可以改用 for
循环。 此预配使预处理语句和后处理语句变得可选。
使用以下代码片段确认是否可以在不使用预处理语句和后处理语句的情况下使用 for
循环。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int64
rand.Seed(time.Now().Unix())
for num != 5 {
num = rand.Int63n(15)
fmt.Println(num)
}
}
只要 num
变量保存的值与 5
不同,程序就会输出一个随机数。
continue&break
用法与c基本相同。
使用 defer 函数进行控制
defer函数
在 Go 中,defer
语句会推迟函数(包括任何参数)的运行,直到包含 defer
语句的函数完成。 通常情况下,当你想要避免忘记任务(例如关闭文件或运行清理进程)时,可以推迟某个函数的运行。
可以根据需要推迟任意多个函数。 defer 语句按逆序运行,先运行最后一个,最后运行第一个。
通过运行以下示例代码来查看此模式的工作原理:
package main
import "fmt"
func main() {
for i := 1; i <= 4; i++ {
defer fmt.Println("deferred", -i)
fmt.Println("regular", i)
}
}
下面是代码输出:
regular 1 regular 2 regular 3 regular 4 deferred -4 deferred -3 deferred -2 deferred -1
在此示例中,请注意,每次推迟 fmt.Println("deferred", -i)
时,都会存储 i
的值,并会将其运行任务添加到队列中。 在 main()
函数输出完 regular
值后,所有推迟的调用都会运行。 这就是你看到输出采用逆序(后进先出)的原因。
defer
函数的一个典型用例是在使用完文件后将其关闭,防止在打开文件完成操作后忘记关闭文件。