首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01|前世今生:你不得不了解的Go的历史和现状
02|拒绝“Hello and Bye”:Go语言的设计哲学是怎么一回事?
03|配好环境:选择一种最适合你的Go安装方法
04|初窥门径:一个Go程序的结构是怎样的?
05|标准先行:Go项目的布局标准是什么?
06|构建模式:Go是怎么解决包依赖管理问题的?
07|构建模式:Go Module的6类常规操作
08|入口函数与包初始化:搞清Go程序的执行次序
09|即学即练:构建一个Web服务就是这么简单
10|变量声明:静态语言有别于动态语言的重要特征
11|代码块与作用域:如何保证变量不会被遮蔽?
12|基本数据类型:Go原生支持的数值类型有哪些?
13|基本数据类型:为什么Go要原生支持字符串类型?
14|常量:Go在“常量”设计上的创新有哪些?
15|同构复合类型:从定长数组到变长切片
16|复合数据类型:原生map类型的实现机制是怎样的?
17|复合数据类型:用结构体建立对真实世界的抽象
18|控制结构:if的“快乐路径”原则
19|控制结构:Go的for循环,仅此一种
20|控制结构:Go中的switch语句有哪些变化?
21|函数:请叫我“一等公民”
22|函数:怎么结合多返回值进行错误处理?
23|函数:怎么让函数更简洁健壮?
24|方法:理解“方法”的本质
25|方法:方法集合与如何选择receiver类型?
26|方法:如何用类型嵌入模拟实现“继承”?
27|即学即练:跟踪函数调用链,理解代码更直观
28|接口:接口即契约
29|接口:为什么nil接口不等于nil?
30|接口:Go中最强大的魔法
31|并发:Go的并发方案实现方案是怎样的?
32|并发:聊聊Goroutine调度器的原理
33|并发:小channel中蕴含大智慧
34|并发:如何使用共享变量?
35|即学即练:如何实现一个轻量级线程池?
36|打稳根基:怎么实现一个TCP服务器?(上)
37|代码操练:怎么实现一个TCP服务器?(中)
38|成果优化:怎么实现一个TCP服务器?(下)
39 | 驯服泛型:了解类型参数
40|驯服泛型:定义泛型约束
41 | 驯服泛型:明确使用时机
当前位置:
首页>>
技术小册>>
Go语言入门实战经典
小册名称:Go语言入门实战经典
### 第19章 控制结构:Go的for循环,仅此一种 在Go语言中,控制结构是编程中不可或缺的一部分,它们允许我们根据条件执行代码块,或重复执行某段代码直到满足特定条件。与其他编程语言相比,Go语言在控制结构的设计上显得尤为简洁而强大。本章将深入探讨Go语言中的核心控制结构——`for`循环,展示其如何通过灵活多变的形式,几乎覆盖了所有循环控制的需求,实现了“仅此一种”的高效与强大。 #### 1. `for`循环基础 Go语言的`for`循环是其唯一的循环控制结构,但它比传统意义上的`for`循环要灵活得多。基本语法如下: ```go for 初始化语句; 条件表达式; 后置语句 { // 循环体 } ``` - **初始化语句**:在循环开始前执行一次,通常用于初始化循环控制变量。 - **条件表达式**:在每次循环开始前评估。如果条件为真(即非零),则执行循环体;如果为假(即零),则退出循环。 - **后置语句**:在每次循环体执行完毕后执行,通常用于更新循环控制变量。 然而,Go的`for`循环并不局限于上述形式,它支持省略部分语句,甚至完全以不同的形式出现,以满足不同场景下的需求。 #### 2. 省略初始化语句和后置语句 当循环的初始化在循环外部完成时,或者循环控制变量在循环体内更新时,可以省略初始化语句和后置语句。例如: ```go i := 0 for i < 10 { fmt.Println(i) i++ } ``` 这里,`i`的初始化和更新都发生在`for`循环之外,循环条件仅包含`i < 10`。 #### 3. 无限循环 省略条件表达式可以创建一个无限循环,这在某些场景下(如等待外部事件)非常有用。通过`break`语句可以在适当的时候退出循环。 ```go for { // 执行某些操作 if someCondition { break } } ``` #### 4. 使用`range`的`for`循环 Go的`for`循环还可以与`range`关键字结合使用,用于遍历数组、切片、字符串、映射或通道。这种方式让迭代集合变得异常简单和直观。 - **遍历切片或数组**: ```go slice := []int{1, 2, 3, 4, 5} for index, value := range slice { fmt.Printf("Index: %d, Value: %d\n", index, value) } ``` - **遍历字符串**: ```go str := "hello" for index, runeValue := range str { fmt.Printf("Index: %d, Rune: %c\n", index, runeValue) } ``` 注意,在遍历字符串时,`range`返回的是字符的Unicode码点(rune)及其索引。 - **遍历映射**: ```go m := map[string]int{"one": 1, "two": 2} for key, value := range m { fmt.Printf("Key: %s, Value: %d\n", key, value) } ``` 映射的遍历顺序是不确定的,每次运行可能得到不同的结果。 #### 5. `for`循环的高级用法 Go的`for`循环还支持更复杂的控制逻辑,通过嵌套循环、标签(labels)和`continue`语句等,实现更精细的控制流程。 - **嵌套循环**: 嵌套循环是控制结构中的常见模式,用于处理多维数据结构。 ```go for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { fmt.Printf("(%d, %d)\n", i, j) } } ``` - **标签(Labels)与`break`/`continue`**: 标签允许我们指定`break`或`continue`语句跳出或继续到特定的外层循环。这在处理多层嵌套循环时特别有用。 ```go OuterLoop: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 5 { break OuterLoop // 跳出外层循环 } fmt.Printf("(%d, %d)\n", i, j) } } ``` - **使用`continue`跳过迭代**: `continue`语句用于跳过当前循环的剩余部分,直接开始下一次迭代。 ```go for i := 0; i < 10; i++ { if i%2 == 0 { continue // 跳过偶数 } fmt.Println(i) } ``` #### 6. 总结 Go语言的`for`循环,虽然形式上看似简单,但通过其灵活的语法和强大的功能,几乎能够覆盖所有循环控制的需求。无论是基础的迭代、无限循环,还是复杂的嵌套循环、带有`range`的迭代以及通过标签进行的精细控制,`for`循环都能以简洁而高效的方式实现。掌握`for`循环的多种用法,对于编写清晰、可维护的Go代码至关重要。 通过本章的学习,你应该能够熟练运用Go的`for`循环来处理各种循环控制问题,从而编写出更加高效、简洁的代码。记住,虽然Go的`for`循环“仅此一种”,但它足以应对绝大多数循环控制的挑战。
上一篇:
18|控制结构:if的“快乐路径”原则
下一篇:
20|控制结构:Go中的switch语句有哪些变化?
该分类下的相关小册推荐:
Go开发权威指南(上)
深入浅出Go语言核心编程(三)
go编程权威指南(二)
Go Web编程(中)
Golang修炼指南
go编程权威指南(四)
深入浅出Go语言核心编程(五)
Go开发权威指南(下)
go编程权威指南(一)
深入浅出Go语言核心编程(八)
Go语言从入门到实战
深入浅出Go语言核心编程(六)