写 Go 程序时,代码默认是自上而下执行,但真实业务里很少只有一条直线流程。什么时候进入某段逻辑、遇到不同条件如何分支、重复任务怎样收束,都会落到流程控制语句上。下面按判断、选择和循环三个方向拆开讲,并保留可直接上手的示例,帮助你快速判断 Go 在这些场景里的常见写法。
什么是流程控制
流程控制,说白了就是控制程序在不同条件下的执行顺序。哪些代码先执行,哪些代码后执行,哪些代码只有在条件满足时才会运行,都属于流程控制的范围。
一般情况下,程序会按照从上到下的顺序执行;但只要引入条件判断、分支选择或循环,执行路径就会发生变化。Go 里最常见的流程控制主要包括三类:
- 条件语句:
if / else - 选择语句:
switch / case - 循环语句:
for
理解这三类语句后,基本就能覆盖日常 Go 入门阶段的大多数控制逻辑。
条件判断:if / else 怎么写
if 用来处理“满足条件就执行”的场景。在 Go 中,if 后面的条件表达式返回结果必须是 bool 类型,不能像某些语言那样直接拿整数或其他类型充当真假值。
下面这段代码根据分数输出不同结果:
var score = 80
if score >= 80 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
这段逻辑的执行顺序很直接:
- 先判断
score >= 80,成立就输出“优秀” - 如果不成立,再继续判断
score >= 60 - 前两个条件都不满足时,进入
else
适合用 if / else 的情况通常是:条件范围清晰,而且你希望按先后顺序逐个判断。像成绩分档、参数校验、状态检查这类场景,都会频繁用到这一写法。
多分支选择:switch / case 的匹配方式
当一个变量可能对应多种明确结果时,用 switch 往往比连续写多个 if / else if 更清晰。它会按照从上到下的顺序依次匹配,一旦命中,就不再继续向下判断其他条件。

var grade = "A"
switch grade {
case "A":
fmt.Println("优秀")
// break,go语言中自带break语句
case "B":
fmt.Println("良好")
case "C":
fmt.Println("及格")
default: // 如果前面的条件没有命中,则运行defalut里的语句
fmt.Println("不及格")
}
这段代码有两个初学者容易记错的点:
- Go 的
switch是从上到下匹配的 - 每个
case命中后默认就会结束当前分支,不需要手动写break
如果前面的 case 都没有命中,就会执行 default。因此在枚举值判断、分类输出、状态码分发这类场景中,switch 会比多层 if 更整齐,也更容易读。
循环语句:Go 里只有 for,但写法不少
Go 没有单独的 while 关键字,循环主要依赖 for。但 for 的灵活度很高,既能写传统三段式循环,也能写类 while 结构,甚至还能写无限循环。

标准三段式 for
这是最常见的一种写法,由初始语句、条件控制语句和结尾语句组成:
// 从0打印到10
for i := 0; i <= 10; i++ {
fmt.Println(i)
}
其中:
i := 0是初始语句i <= 10是继续循环的条件i++是每轮结束后的更新动作
这种形式最适合次数明确的循环,比如遍历固定区间、按序计数等。
省略初始语句的 for
for 的三个部分并不是必须全部写出。下面这个例子省略了初始语句:
var j = 10
// 省略掉初始语句,从0打印到10
for ; j >= 0; j-- {
fmt.Println(j)
}
这里的变量 j 已经在循环外定义,所以初始化部分可以留空。只要条件和结尾语句还在,循环仍然成立。
类 while 写法
如果把初始语句和结尾语句都省略,只保留条件判断,for 就很像其他语言里的 while:
var k = 10
for k >= 0 { // 省略初始语句和结尾语句,类似其他语言的while语句
k--
fmt.Println(k)
}
这种形式适合“只要条件满足就持续执行”的逻辑,比如等待状态变化、按条件反复处理任务等。
无限循环、break 与 continue
for 还可以连条件都不写,形成无限循环。此时一般会配合 break 和 continue 控制执行节奏:
var l = 0
for {
if l > 10 {
break // 终止for循环
}
if l == 4 {
continue // 跳过本次循环
}
fmt.Println(l)
l++
}
这里需要特别注意逻辑顺序:
break用来直接终止整个循环continue用来跳过本次循环剩余代码,进入下一轮
这类写法常见于持续监听、消费任务、等待输入等无法预先确定循环次数的场景。不过写无限循环时也要格外小心,出口条件必须明确,否则很容易让程序一直跑不出来。
用嵌套循环输出九九乘法表
理解完单层循环后,再看一个更完整的例子:用嵌套 for 输出九九乘法表。

for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d x %d = %d ", j, i, j*i)
}
fmt.Println("")
}
这段代码的关键在于两层循环的分工:
- 外层循环控制行数,
i从1到9 - 内层循环控制每一行输出多少列,
j的上限跟随i变化
因此第一行输出 1 个算式,第二行输出 2 个算式,直到第九行输出 9 个算式,最终形成三角形排布。
输出结果如下:
1 x 1 = 1
1 x 2 = 2 2 x 2 = 4
1 x 3 = 3 2 x 3 = 6 3 x 3 = 9
1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16
1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49
1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64
1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81
这个例子虽然简单,但很适合用来理解嵌套循环、边界条件和格式化输出之间的关系。对于刚接触 Go 的读者来说,它也是把语法规则转成实际结果的一个直观练习。
怎么快速选用这三类流程控制
如果只做入门阶段的快速区分,可以按下面的思路判断:
- 只在某个条件成立时执行代码,用
if / else - 一个变量对应多个明确分支,用
switch / case - 需要重复执行一段逻辑,用
for
Go 的流程控制并不复杂,关键在于先想清楚你的代码是在“做判断”“做选择”还是“做重复执行”。把这个问题分清之后,再落到具体语法上,写出来的逻辑通常就不会乱。









