go 语言仅用 for 实现所有循环,通过省略 init、condition 或 post 表达式可模拟 while 或无限循环;三部分须用分号分隔,不可加括号或逗号。

Go 语言没有 while、do-while,只有 for 一种循环结构,但它能覆盖所有常见循环需求 —— 关键在于你是否理解三个表达式(init; condition; post)哪些可省、何时该省、省了之后行为怎么变。
标准三段式 for:初始化、条件、后置操作都写全
这是最接近 C/Java 的写法,适合明确计数场景,比如遍历数组索引或固定次数执行。
-
for后必须用分号;分隔三部分,不能用逗号,也不能加括号 —— 写成for (i := 0; i 会直接编译失败 - 初始化语句(如
i := 0)作用域仅限该for块内,循环外无法访问i - 条件判断在每次迭代「前」执行;后置语句(如
i++)在本轮循环体执行完、「下轮条件判断前」运行 - 示例:
for i := 0; i
省略条件表达式:实现 while 逻辑
当循环次数不确定、依赖内部状态(比如重试、读取通道、等待条件满足),就省掉中间的 condition,只留 init 和 post,或全都不写 init/post。
- 写法一(带 init/post):
for count := 0; count —— 注意这里仍需 <code>break退出,否则可能超次 - 写法二(无 init/post):
for ok { doWork(); ok = checkDone() }—— 条件变量ok必须在循环体内更新,否则死循环 - 常见错误:把条件写在循环体末尾却忘了更新,导致无限执行
完全省略三部分:进入无限循环,靠 break 或 return 出来
这种写法常用于事件驱动、服务器主循环、select 配合 channel 的场景,但极易卡死。
- 语法就是
for { ... },连分号都不需要 - 必须确保循环体内有
break、return、os.Exit()或 panic,否则程序永远卡在那 - 典型陷阱:在
for { select { ... } }中漏写default或超时分支,channel 阻塞后整个循环停摆 - 示例:
for { select { case msg :=
range 遍历要注意值拷贝和地址复用
range 不是语法糖,它底层是按值复制元素,且复用同一个变量地址 —— 这点在存指针或闭包捕获时极容易出错。
- 遍历切片时,
value是副本,&value永远指向同一内存地址,所有指针最终都指向最后一个元素 - 正确做法:用索引取地址,
&slice[i];或在循环内声明新变量接收value再取址 - 遍历 map 时顺序不保证,不要依赖输出顺序;遍历字符串时
value是rune类型,不是byte - 只用索引或只用值时,用
_占位,避免编译器警告:for _, v := range data
真正难的不是语法本身,而是判断该用哪一种形式:计数就用三段式,状态驱动就用省略 condition 的写法,阻塞等待就用 for { select {} }。最容易被忽略的是变量作用域和值拷贝行为 —— 尤其在并发或构造切片指针时,一不留神就拿到一堆重复地址。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











