说明
本章主要说明流程控制
下面的示例代码来自于这里
循环
for
go只有一种循环结构,for循环
一个简单的示例如下:
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
for 循环中没有了
( )
,而{ }
是必须的可以设置前置、后置语句为空
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
while
- go中没有while循环,但可以用for循环更简单的写法,即省略分号,和while语法类似,代码如下:
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
死循环
- 如果省略了循环条件,循环就不会结束
package main
func main() {
for {
}
}
条件判断
if
- 同for一样,没有了
( )
,而{ }
是必须的
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
语句可以在条件之前执行一个简单的语句,由这个语句定义的变量的作用域仅在 if 范围之内
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),
)
}
switch
- 从上到下的执行,当匹配成功的时候停止
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:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}
除非以 fallthrough 语句结束,否则分支会自动终止
另外一种写法是省略switch后面的条件,case 后面的值变为布尔类型,这一构造使得可以用更清晰的形式来编写长的 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.")
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")
}
坑
- 在go中,下面的写法是错误的
func main()
{
fmt.Println(sqrt(2), sqrt(-4))
}
左侧的大括号必须在末尾