🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
🔍 基础用法与示例
⚠️ 重要细节与技巧
💡 常见问题解答
Go 语言中的range关键字是用于for循环的迭代器,可以遍历数组、切片、字符串、映射(map)和通道(channel),让元素遍历变得简洁清晰。
数据结构 | 返回的第一个值 | 返回的第二个值 (若适用) | 备注 |
|---|---|---|---|
数组 / 切片 | 索引 (int) | 对应索引的元素值 | 索引从 0 开始 |
字符串 | 字符的起始字节索引 (int) | 对应的 Unicode 码点 (rune) | 迭代的是 Unicode 字符,而非字节 |
映射 (map) | 键 (key) | 对应的值 (value) | 迭代顺序不固定 |
通道 (channel) | 从通道接收到的值 | (无) | 通常只用一个变量接收 |
🔍 基础用法与示例
range在遍历不同数据结构时,会返回一个或两个值。你可以使用_(空白标识符) 来忽略不需要的值。
遍历切片/数组
nums := []int{10, 20, 30} // 同时获取索引和值 for index, value := range nums { fmt.Printf("索引: %d, 值: %d\n", index, value) } // 忽略索引,只获取值 for _, value := range nums { fmt.Printf("值: %d\n", value) } // 忽略值,只获取索引 for index := range nums { fmt.Printf("索引: %d\n", index) }遍历映射 (map)
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome"} // 同时获取键和值 for country, capital := range countryCapitalMap { fmt.Printf("%s 的首都是 %s\n", country, capital) } // 只获取键 for country := range countryCapitalMap { fmt.Printf("国家: %s\n", country) }遍历字符串
str := "Go" for index, charCode := range str { fmt.Printf("字符索引: %d, Unicode 码点: %d, 字符: %c\n", index, charCode, charCode) } // 输出: // 字符索引: 0, Unicode 码点: 71, 字符: G // 字符索引: 1, Unicode 码点: 111, 字符: o遍历通道 (channel)
ch := make(chan int, 2) ch <- 1 ch <- 2 close(ch) // 遍历通道前必须先关闭,否则会阻塞 for elem := range ch { fmt.Println(elem) // 依次输出 1, 2 }⚠️ 重要细节与技巧
值复制与引用
对数组或切片使用
range时,value是原始数据中元素的副本。修改value不会影响原始数据。如果需要修改原始切片或数组的元素,应该通过索引来操作。
numbers := []int{1, 2, 3} for i := range numbers { numbers[i] *= 2 // 通过索引修改原始元素 } fmt.Println(numbers) // 输出: [2 4 6]映射的遍历顺序
Go 语言中映射的遍历顺序是不固定的(随机性)。这是设计上的刻意为之,旨在提醒开发者不要依赖映射的内部顺序。每次遍历的顺序可能都不一样。
性能考量与最佳实践
对于大数组,可以考虑先获取其切片再遍历,以避免复制整个数组。
如果遍历时只需要索引,写成
for index := range slice比for index, _ := range slice更简洁。在遍历通道时,务必确保通道在适当的时候被关闭,否则循环可能会一直阻塞。
💡 常见问题解答
for和for range有什么区别?
for循环:更通用,可以通过索引进行灵活控制,适合已知循环次数或需要复杂步进的场景。for range:语法更简洁,专为迭代各种集合元素设计,能安全地遍历整个集合而不会越界。对于映射和通道,for range是直接获取元素的唯一简便方式。
range关键字是 Go 语言中处理集合数据的利器,理解其特性和细节能帮助你写出更高效、更安全的代码。希望这些解释和示例对你有帮助!
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙