如何在Golang中使用循环语句_Golangfor循环和range应用
发布时间 - 2026-01-10 00:00:00 点击率:次Go 只有 for 循环,无 while/do-while;它支持三段式、条件式和无限式三种写法,range 是遍历集合的语法糖,但返回值易被误读。
Go 语言里没有 while 或 do-while,只有一种循环:for。它既承担传统 for 的角色,也覆盖了其他语言中 while 的用法;而 range 是专为遍历集合设计的语法糖,但它的行为和返回值容易被误读。
Go 的 for 有三种写法,别硬套 C 风格
很多人初学时死记“初始化;条件;后置操作”三段式,结果在需要 while 逻辑时卡住。其实 Go 的 for 更灵活:
for i := 0; i —— 标准三段式,适用于已知次数的迭代-
for condition { ... }—— 纯条件循环,等价于 while;注意:没写break就是死循环 -
for { ... }—— 无限循环,必须靠break或return退出,常用于服务器主循环或状态轮询
错误示例:for (i = 0; i 会编译失败——Go 不支持括号包裹条件,也不允许省略分号(其实是语句分隔符,不是可选符号)。
range 遍历时下标和值的顺序不能反
range 返回两个值:索引(index)和元素(value)。但不同数据类型的第一个返回值含义不同,且一旦变量名写错顺序,就会得到意外结果:
- 对 slice 或 array:
range []int{1,2,3}→ 第一个值是下标(0,1,2),第二个是值(1,2,3) - 对 map:
range map[string]int{"a":1}→ 第一个值是 key("a"),第二个是 value(1);但 map 遍历无序,不能依赖顺序 - 对 string:
range→ 第一个值是 rune 索引(字节偏移),第二个是 rune 值(
"好"'好');不是 byte 索引,所以len("好") == 3,但range只走 1 次
常见错误:写成 for v, i := range s,本意想取值,结果 v 变成了下标,i 变成了值,后续逻辑全错。
用 range 遍历切片时,不要直接取地址存入 slice
这是 Go 新手高频踩坑点:循环中对 range 返回的 value 取地址,最后所有指针都指向同一个内存位置。
nums := []int{1, 2, 3}
var ptrs []*int
for _, v := range nums {
ptrs = append(ptrs, &v) // ❌ 全部指向 v 的最后一轮值(3)
}
// ptrs[0], ptrs[1], ptrs[2] 解引用后全是 3
正确做法是显式创建新变量或取原 slice 的地址:
// ✅ 方案一:用索引取地址
for i := range nums {
ptrs = append(ptrs, &nums[i])
}
// ✅ 方案二:在循环内声明新变量
for _, v := range nums {
v := v // 创建新变量
ptrs = append(ptrs, &v)
}
for 和 range 的性能与逃逸分析
大多数情况下,range 编译后和手动索引 for 性能几乎一致(Go 1.21+ 对 slice range 做了优化),但要注意几点:
- 对小数组(如
[4]int)用range不会逃逸;但对大数组或未指定大小的[...]T,可能触发栈上分配或逃逸到堆 - 用
for i := 0; i 时,如果s是函数参数,每次循环都调用len()—— 实际上编译器会优化掉,不用手动缓存,除非你明确看到性能差异 - map 的
range是 O(n) 但带随机性,且期间禁止写入 map(会 panic:fatal error: concurrent map iteration and map write)
真正影响性能的往往不是 for 写法本身,而是循环体内是否做了不必要的内存分配、是否触发了 GC,或者是否在循环中调用了阻塞 I/O。
# go
# golang
# app
# 字节
# 栈
# 数据类型
# String
# Array
# for
# while
# Error
# break
# int
# 循环
# 指针
# 堆
# 切片
# len
# map
# 第一个
# 遍历
# 第二个
# 返回值
# 误读
# 这是
# 变成了
# 就会
# 也不
# 很多人
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python图片处理进阶教程_Pillow滤镜与图像增强
java获取注册ip实例
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel如何使用Eloquent进行子查询
lovemo网页版地址 lovemo官网手机登录
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何在搬瓦工VPS快速搭建网站?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
如何将凡科建站内容保存为本地文件?
实例解析Array和String方法
Laravel如何处理异常和错误?(Handler示例)
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
手机软键盘弹出时影响布局的解决方法
如何确保西部建站助手FTP传输的安全性?
Python结构化数据采集_字段抽取解析【教程】
如何在阿里云服务器自主搭建网站?
Laravel怎么上传文件_Laravel图片上传及存储配置
如何实现建站之星域名转发设置?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
海南网站制作公司有哪些,海口网是哪家的?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
微信推文制作网站有哪些,怎么做微信推文,急?
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
WEB开发之注册页面验证码倒计时代码的实现
如何在局域网内绑定自建网站域名?
长沙做网站要多少钱,长沙国安网络怎么样?
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么为数据库表字段添加索引以优化查询
详解jQuery中的事件
如何快速生成凡客建站的专业级图册?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
javascript读取文本节点方法小结
详解Android图表 MPAndroidChart折线图
如何用虚拟主机快速搭建网站?详细步骤解析
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何实现javascript表单验证_正则表达式有哪些实用技巧
高端网站建设与定制开发一站式解决方案 中企动力
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
JavaScript常见的五种数组去重的方式


"好"