1.4 流程控制
if/else 条件语句
go
package main
import (
"fmt"
"time"
)
func main() {
// 基本 if
age := 20
if age >= 18 {
fmt.Println("成年人")
}
// if-else
if age >= 60 {
fmt.Println("老年人")
} else if age >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年")
}
// if 初始化语句
if hour := time.Now().Hour(); hour < 12 {
fmt.Println("上午好")
} else {
fmt.Println("下午好")
}
// 错误检查模式
result, err := doSomething()
if err != nil {
fmt.Println("出错了:", err)
return
}
// Guard Clause
if err := validate(); err != nil {
return err
}
// 主逻辑
}
func doSomething() (string, error) {
return "result", nil
}
func validate() error {
return nil
}switch 语句
go
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// 基本 switch
day := time.Now().Weekday()
switch day {
case time.Monday:
fmt.Println("周一")
case time.Tuesday, time.Wednesday:
fmt.Println("周二或周三")
default:
fmt.Println("其他")
}
// switch 带初始化
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("macOS")
case "linux":
fmt.Println("Linux")
default:
fmt.Println("其他")
}
// 无条件 switch
num := 75
switch {
case num < 50:
fmt.Println("0-49")
case num < 100:
fmt.Println("50-99")
default:
fmt.Println("100 以上")
}
}Type Switch
go
package main
import "fmt"
func main() {
var values []any = []any{"hello", 42, 3.14, true}
for _, v := range values {
switch val := v.(type) {
case int:
fmt.Printf("整数:%d\n", val)
case string:
fmt.Printf("字符串:%s\n", val)
case float64:
fmt.Printf("浮点数:%.2f\n", val)
default:
fmt.Printf("未知类型:%T\n", val)
}
}
}for 循环
go
package main
import "fmt"
func main() {
// 传统 for
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum) // 45
// while 风格
count := 0
for count < 5 {
count++
}
// 无限循环
for {
break
}
// range 遍历切片
nums := []int{1, 2, 3}
for i, v := range nums {
fmt.Println(i, v)
}
// range 遍历 Map
m := map[string]int{"a": 1}
for k, v := range m {
fmt.Println(k, v)
}
// range 遍历字符串
for i, r := range "你好" {
fmt.Println(i, r)
}
}break, continue, goto
go
package main
import "fmt"
func main() {
// break
for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Print(i, " ") // 0 1 2 3 4
}
// 标签 break
Outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i+j == 3 {
break Outer
}
}
}
// continue
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Print(i, " ") // 0 1 3 4
}
}defer 语句
go
package main
import "fmt"
func main() {
defer fmt.Println("最后执行")
fmt.Println("先执行")
// 资源清理
cleanup()
// recover 捕获 panic
safeFunc()
}
func cleanup() {
fmt.Println("获取资源")
defer fmt.Println("释放资源")
}
func safeFunc() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获 panic:", r)
}
}()
panic("出错了")
}