for
Go 只设计了一种循环 就是 for 循环。
基本的 for 循环包含三个组成部分(由 分号 分开):
for i:=1; i < 10; i++ { // i:=1 初始化语句 // i < 10 循环条件表达式 // i++ 后置语句 }初始化语句;循环条件表达式;后置语句
初始化语句:在第一次循环执行前被执行
循环条件表达式:每次迭代开始前被求值
后置语句:每次迭代后被执行
初始化语句一般是一个短变量什么,这里声明的变量只能在整个 for 循环作用域中可见。
如果条件表达式的值为 false , 那么迭代终止。
注:Go 不像C,Java,或者Javascript 等其他语言,for语句的三个组成部分 并不需要用括号括起来,但循环体必须用 {} 括起来 表明作用域。
另:循环初始化语句和后置语句都是可选的。
for 是 Go 的 "while" 基于此可以省略分号: C 的 while 在 Go 中叫 for
循环条件可以省略,如果省略了则循环不会结束,
for { //做你要做的}因此可以用简洁地形式表达死循环。
if
就像 for 循环一样,Go 的 if 语句也不要求用 () 将条件括起来,同时, {} 还是必须有的。
if 的便捷语句
跟 for 一样,if 语句可以在条件之前执行一个简单语句。
由这个语句定义的变量的作用域仅在 if 范围之内。
if 和 else
在 if 的便捷语句定义的变量同样可以在任何对应的 else 块中使用。
if ok:=func(); ok { } else {}
switch
num := 0switch {case num < 1: fallthroughcase num <= 2: fmt.Println("num <= 2")default: fmt.Println("default")}除非以 fallthrough 语句结束,否则分支会自动终止。
switch 的执行顺序
switch 的条件从上到下的执行,当匹配成功的时候停止。
注意:Go playground 中的时间总是从 2009-11-10 23:00:00 UTC 开始。
没有条件的switch
没有条件的 switch 同 switch true 一样。
这一构造使得可以用更清晰的形式来编写长的 if - then - else 链
defer
defer 语句会延迟函数的执行直到上层函数返回。
延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。
defer 栈
延迟的函数调用被压入一个栈中。但函数返回时,会按照后进先出的顺序调用被延迟的函数调用。
eg:
例中 defer 后的 fmt.Println("defer") 将会在 main 的 return 后执行
func main() { defer fmt.Println("defer") num := 0 switch { case num < 1: fallthrough case num <= 2: fmt.Println("num <= 2") default: fmt.Println("default") } return}