Go(二)流程控制

一、for

Go中只有一种循环结构:for 循环。
基本的 for 循环由三部分组成,它们用分号隔开:
1、初始化语句:在第一次迭代前执行
2、条件表达式:在每次迭代前求值
3、后置语句:在每次迭代的结尾执行
初始化语句通常为一句短变量声明,该变量声明仅在 for 语句的作用域中可见。

一旦条件表达式的布尔值为 false,循环迭代就会终止。

注意:和 C、Java、JavaScript 之类的语言不同,Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//基础语法
func loop(step int) {
sum := 0
for i:= 0; i< step; i++ {
sum += i
}
fmt.Println(sum)
}

//初始化语句和后置语句是可选的。
//将loop() 可简化为
func loop2(step int) {
sum := 1
for ; sum < step; {
sum += sum
}
fmt.Println(sum)
}

//for 是 Go 中的 “while”
func while(step int) {
sum := 1
for sum < step {
sum += sum
}
fmt.Println(sum)
}

//死循环
func unlimitedLoop() {
for {
fmt.Printf("无限循环 step = %d \n",step)
}
}

二、if…else…

Goif 语句与 for 循环类似,表达式外无需小括号 ( ) ,而大括号 { } 则是必须的。

1
2
3
4
5
6
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}

if 的简短语句
if 语句可以在条件表达式前执行一个简单的语句。该语句声明的变量作用域仅在 if 之内。

1
2
3
4
5
6
7
8
9
func pow(x, n, lim float64) float64 {
//计算x的n次幂 如果结果小于lim 则返回结果,否则返回lim
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
return lim
}

三、switch

switch是编写一连串 if...else... 语句的简便方法。它运行第一个值等于条件表达式的case语句。
Goswitch语句类似于C、C++、Java、JavaScript 和 PHP 中的,不过Go只运行选定的case,而非之后所有的case。 实际上,Go 自动提供了在这些语言中每个case后面所需的break语句。 除非以fallthrough语句结束,否则分支会自动终止。 Go的另一点重要的不同在于switchcase无需为常量,且取值不必为整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func grade(gd string)  {
switch gd {
case "A":
fmt.Println("优秀")
case "B":
fmt.Println("良好")
case "C":
fmt.Println("中等")
case "D":
fmt.Println("及格")
case "E":
fmt.Println("差")
default:
fmt.Println("未知")
}
}

没有条件的switch

1
2
3
4
5
6
7
8
9
10
11
12
func unCondition()  {
//当前时间
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("现在是早上")
case t.Hour() < 18:
fmt.Println("现在是下午")
default:
fmt.Println("现在是晚上")
}
}

四、defer

defer 语句会将函数推迟到外层函数返回之后执行。
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。
推迟的函数调用会被压入一个栈中(先进后出)。当外层函数返回时,被推迟的函数会按照先进后出的顺序调用。

1
2
3
4
5
6
7
func deferFun()  {
fmt.Println("方法开始")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("方法结束")
}