Go语言仅支持for循环,可通过省略初始化和后置语句实现while效果,用range遍历集合更安全,for range中取变量地址需注意副本问题。

Go语言不支持 while 或 do-while 语法,这是语言设计的明确取舍——只保留一个循环结构 for,但它的灵活性足以覆盖所有常见场景。
如何用 for 写出等效的 while 循环
只需省略初始化和后置语句,只留条件判断即可。这和 C/Java 中的 while 行为完全一致:
i := 0
for i < 5 {
fmt.Println(i)
i++
}- 常见错误:写成
for (i —— Go 不允许括号,会报错syntax error: unexpected ( - 适用场景:状态轮询、连接重试、事件等待(比如等待某个 flag 变为 true)
- 注意:变量
i的作用域仅限于该for块内,不能在循环外继续使用
模拟 do-while:先执行、再判断
Go 没有内置 do-while,但可以用无限循环 + 条件退出来实现“至少执行一次”:
i := 0
for {
fmt.Println("hello")
i++
if i >= 3 {
break
}
}- 关键点:把逻辑体放在
break判断之前,确保首次必执行 - 容易踩的坑:忘记
break或条件写反(如用==而非>=),导致死循环 - 性能影响:无额外开销,
for {}编译后就是跳转指令,和传统do-while生成的汇编几乎一样
遍历集合时别误用 for 经典形式
对切片、map、字符串等,优先用 range,而不是手写索引循环:
酷纬企业网站管理系统Kuwebs是酷纬信息开发的为企业网站提供解决方案而开发的营销型网站系统。在线留言模块、常见问题模块、友情链接模块。前台采用DIV+CSS,遵循SEO标准。 1.支持中文、英文两种版本,后台可以在不同的环境下编辑中英文。 3.程序和界面分离,提供通用的PHP标准语法字段供前台调用,可以为不同的页面设置不同的风格。 5.支持google地图生成、自定义标题、自定义关键词、自定义描
立即学习“go语言免费学习笔记(深入)”;
// ✅ 推荐:简洁、安全、自动处理中文 rune
for i, v := range slice {
fmt.Println(i, v)
}
// ❌ 不推荐:易越界、难读、对字符串会切错中文
for i := 0; i < len(slice); i++ {
fmt.Println(i, slice[i])
}
- 特别注意:对
string用range是按rune遍历,而用索引是按byte;中文字符可能被截断 - 陷阱:在
for range中取变量地址(如&v)会得到同一个地址,因为v是每次迭代的副本 —— 需要val := v; &val才安全
无限循环的正确退出方式
for {} 常用于服务器主循环或 goroutine 后台任务,但必须有明确退出路径:
for {
select {
case msg := <-ch:
handle(msg)
case <-done:
return // 优雅退出
}
}- 不要只依赖
break,尤其在嵌套或带select的场景中;用return或带标签的break label更可控 - 协程中若没退出机制,程序无法正常终止,
go run会卡住,go build后运行也会持续占资源 - 调试时可加超时保护:
time.AfterFunc(10 * time.Second, func(){ os.Exit(1) })
真正容易被忽略的是:看似简单的 for 省略写法,其变量作用域、内存复用行为、以及和 range 的语义差异,都会在并发或长期运行服务中悄悄引发 bug。写之前,先想清楚你到底要“控制条件”,还是“遍历数据”。









