第 4 章 / 共 20 章
流程控制
if / for / switch / defer
if 语句
条件不需要括号;支持在 if 内声明局部变量。
package main
import (
"fmt"
"strconv"
)
func main() {
s := "42"
if v, err := strconv.Atoi(s); err == nil {
fmt.Println("num:", v)
} else {
fmt.Println("not a number")
}
}for 循环
Go 只有 for,但能表达 C 风格三段式、while、无限循环、range 四种形式。
package main
import "fmt"
func main() {
// 三段式
for i := 0; i < 3; i++ {
fmt.Println(i)
}
// while 风格
n := 3
for n > 0 {
n--
}
fmt.Println("n=", n)
// 无限循环 + break
i := 0
for {
if i >= 2 {
break
}
i++
}
// range:索引+值
for i, v := range []int{10, 20, 30} {
fmt.Println(i, v)
}
}switch
默认不穿透;可用任意表达式当 case,配合 fallthrough 显式穿透。无表达式形式可替代 if-else 链。
package main
import (
"fmt"
"time"
)
func main() {
switch day := time.Now().Weekday(); day {
case time.Saturday, time.Sunday:
fmt.Println("weekend")
default:
fmt.Println("workday")
}
// 无表达式形式:替代 if-else 链
score := 85
grade := "F"
switch {
case score >= 90:
grade = "A"
case score >= 60:
grade = "B"
}
fmt.Println("grade:", grade)
}defer
defer 把语句延迟到所在函数返回前执行,后进先出。常用于关闭资源。
package main
import (
"fmt"
"os"
)
func main() {
if err := readFile("/etc/hostname"); err != nil {
fmt.Println("err:", err)
}
}
func readFile(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // 函数返回前自动调用
info, err := f.Stat()
if err != nil {
return err
}
fmt.Println(info.Name(), info.Size())
return nil
}break / continue / goto
支持标签 break/continue 跳出嵌套循环;goto 仍存在但极少使用。