如何在Golang中使用循环语句_Golangfor循环和range应用

发布时间 - 2026-01-10 00:00:00    点击率:
Go 只有 for 循环,无 while/do-while;它支持三段式、条件式和无限式三种写法,range 是遍历集合的语法糖,但返回值易被误读。

Go 语言里没有 whiledo-while,只有一种循环:for。它既承担传统 for 的角色,也覆盖了其他语言中 while 的用法;而 range 是专为遍历集合设计的语法糖,但它的行为和返回值容易被误读。

Go 的 for 有三种写法,别硬套 C 风格

很多人初学时死记“初始化;条件;后置操作”三段式,结果在需要 while 逻辑时卡住。其实 Go 的 for 更灵活:

  • for i := 0; i —— 标准三段式,适用于已知次数的迭代
  • for condition { ... } —— 纯条件循环,等价于 while;注意:没写 break 就是死循环
  • for { ... } —— 无限循环,必须靠 breakreturn 退出,常用于服务器主循环或状态轮询

错误示例: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)
}

forrange 的性能与逃逸分析

大多数情况下,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常见的五种数组去重的方式