控制流
约 364 字大约 1 分钟
2026-01-18
1. if 语句
括号可省略,花括号不可省。if 支持在条件前写初始化语句,使用分号与条件分隔,初始化声明的变量作用域仅在 if/else 代码块中
初始化与多分支
package main
import "fmt"
func main() {
if a, b := 10, true; a > 5 {
fmt.Println("a>5", a, b)
} else if b {
fmt.Println("fallback because b is true")
} else {
fmt.Println("else branch")
}
// fmt.Println(a) // 编译错误,a/b 作用域仅在 if/else 内
}if 守卫
package main
import "errors"
func mayFail(flag bool) (string, error) {
if flag {
return "", errors.New("failed")
}
return "ok", nil
}
func main() {
if res, err := mayFail(true); err != nil {
// res/err 作用域只在 if/else 内
println("error:", err.Error())
return
} else {
println("success:", res)
}
}2. 循环语句
Go 只有 for 一种循环关键字,可表达三种常见形式:
经典三段式
for init; cond; post {}for i := 0; i < 3; i++ { println(i) }条件式
for cond {},等价于其他语言的whilen := 3 for n > 0 { println(n) n-- }无限循环
for {},常搭配continue跳过循环、break/return退出counter := 0 for { counter++ if counter % 2 == 0 { continue } if counter > 5 { break } fmt.Print(counter, " ") }
2.1 for ... range
range 适用于数组、切片、字符串、map、channel。未用到的下标或值可用 _ 占位。
range 遍历切片与字符串
package main
import "fmt"
func main() {
nums := []int{2, 3, 5}
for i, v := range nums {
fmt.Printf("idx %d => %d\n", i, v)
}
s := "Go语言"
for i, r := range s { // r 是 rune
fmt.Printf("byte@%d rune %c\n", i, r)
}
}