for
1 2 3 4 5 6 7 8 9 10 11
| package main
import "fmt"
func main() { sum := 0 for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) }
|
Go 只有一种循环结构 —— for 循环。
基本的 for 循环除了没有了 ( )
之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中做的一样,而 { }
是必须的。
1 2 3 4 5 6 7 8 9 10 11
| package main
import "fmt"
func main() { sum := 1 for ; sum < 1000; { sum += sum } fmt.Println(sum) }
|
跟 C 或者 Java 中一样,可以让前置、后置语句为空。
for 是 Go 的 “while”
1 2 3 4 5 6 7 8 9 10 11
| package main
import "fmt"
func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum) }
|
基于此可以省略分号:C 的 while
在 Go 中叫做 for
。
if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package main
import ( "fmt" "math" )
func sqrt(x float64) string { if x < 0 { return sqrt(-x) + "i" } return fmt.Sprint(math.Sqrt(x)) }
func main() { fmt.Println(sqrt(2), sqrt(-4)) }
|
if 语句除了没有了 ( )
之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中的一样,而 { }
是必须的。
if 的便捷语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import ( "fmt" "math" )
func pow(x, n, lim float64) float64 { if v := math.Pow(x, n); v < lim { return v } return lim }
func main() { fmt.Println( pow(3, 2, 10), pow(3, 3, 20), ) }
|
跟 for 一样, if 语句可以在条件之前执行一个简单的语句。
由这个语句定义的变量的作用域仅在 if 范围之内。
(在最后的 return 语句处使用 v 看看。)
else
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "fmt" "math" )
func pow(x, n, lim float64) float64 { if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %g\n", v, lim) } return lim }
func main() { fmt.Println( pow(3, 2, 10), pow(3, 3, 20), ) }
|
在 if 的便捷语句定义的变量同样可以在任何对应的 else 块中使用。
switch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import ( "fmt" "runtime" )
func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: fmt.Printf("%s.", os) } }
|
除非以 fallthrough
语句结束,否则分支会自动终止。
没有条件的 switch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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.") } }
|
没有条件的 switch 同 switch true
一样。
这一构造使得可以用更清晰的形式来编写长的 if-then-else 链。
defer
1 2 3 4 5 6 7 8 9
| package main
import "fmt"
func main() { defer fmt.Println("world")
fmt.Println("hello") }
|
defer 语句会延迟函数的执行直到上层函数返回。
延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。
defer 栈
1 2 3 4 5 6 7 8 9 10 11 12 13
| package main
import "fmt"
func main() { fmt.Println("counting")
for i := 0; i < 10; i++ { defer fmt.Println(i) }
fmt.Println("done") }
|
延迟的函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用。