Go语言学习笔记(四)-控制语句
2017-03-21 本文已影响11人
EvansChang
循环结构
Go中只存在一种循环结构-for循环。基本的for循环由三部分组成:
- 初始化语句:第一次迭代前执行
- 条件表达式:每次迭代前执行
- 后置语句:每次迭代后执行
Go的for循环语句后面不需要小括号包裹,但是必须存在大括号。此外,初始化语句与后置语句可以省略,因为Go中的for等价于C中的while,一次当我们写无限循环时可以忽略条件表达式,将for循环写到很紧凑的程度,例如:
package main
import "fmt"
func main(){
for{//无线循环
fmt.Println("Hello World");
}
}
if
Go的if语句与for相似,不需要括号,但是必须存在大括号。与其他语言中的if语句不通的是Go中的if可以在表达式之前执行一个简单的语句,而该语句中声明的变量只能在if之中,可以参考如下代码:
package main
import(
"fmt"
"math"
)
func pow(x,y,max float64) float64{
if v := math.Pow(x,y); v<max{
return v
}else{
fmt.Println("%g >= %g",v,max)
}
return max
}
func main(){
fmt.Println(
pow(3,2,10),
pow(3,3,20),
)
}
从上述代码中我们可以看出,if语句表达式之前的简单语句需要以分号与条件语句隔开。
switch
同理switch语句与其他语句的差别也是在条件一句前可以存在简单语句且以分好隔开,不需要小括号而是必须存在大括号。特别需要说明的是which语句只有当以fallthrough语句结束时才能继续执行下一个case否则将直接结束分支。switch语句页可以不存在条件语句,此时等同于if-then-else结构。代码如下:
package main
import (
"fmt"
"time"
)
func main(){
t := time.Now()
switch{
case t.Hour() <12 :
fmt.Println("Good Morning")
case t.Hour() <17 :
fmt.Println("Good Afternoon")
fallthrough
default:
fmt.Println("Good Evening")
}
}
我写代码的时候是下午15点,因此执行之后会输出”Good Afternoon”与”Good Evning”两条语句。
defer
defer语句会将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。