for
基本的 for 循环由三部分组成,它们用分号隔开:
- 初始化语句:在第一次迭代前执行
- 条件表达式:在每次迭代前求值
- 后置语句:在每次迭代的结尾执行
初始化语句通常为一句短变量声明,该变量声明仅在 for 语句的作用域中可见。
注意:Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的。
package main
import "fmt"
func main(){
var sum int = 0
for i:=0 ; i<10 ; i++ {
sum += i
}
fmt.Println(sum)
}
while
C 的 while 在 Go 中叫做 for
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
if
Go 的 if 语句与 for 循环类似,表达式外无需小括号 ( ) ,而大括号 { } 则是必须的。
package main
import "fmt"
func main(){
var num := 10
if num < 10{
fmt.Println("Hi World")
}
}
if 的简短语句
同 for 一样, if 语句可以在条件表达式前执行一个简单的语句。
该语句声明的变量作用域仅在 if 之内。
package main
import (
"fmt"
"math"
)
func main(){
if v := math.Pow(1); v < 1{
fmt.Println("OK")
}
}
if 和 else
在 if 的简短语句中声明的变量同样可以在任何对应的 else 块中使用。
package main
import "fmt"
func main(){
if v := math.Pow(1); v < lim {
fmt.Println(v)
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
}
switch
Go 自动提供了在这些语言中每个 case 后面所需的 break 语句。 除非以 fallthrough 语句结束,否则分支会自动终止。 Go 的另一点重要的不同在于 switch 的 case 无需为常量,且取值不必为整数。
package main
import (
"fmt"
"runtime"
)
func main() {
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "Linux":
fmt.Println("Linux.")
default:
fmt.Println("end")
}
}
没有条件的switch
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.")
default:
fmt.Println("Good evening.")
}
}
defer
defer 语句会将函数推迟到外层函数返回之后执行。
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用
package main
import "fmt"
func main(){
defer fmt.Println("world")
fmt.Println("hello")
}
defer 栈
推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}