首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
复杂数据类型
值类型和指针类型
值类型和指针类型的存储结构
为什么要区分值类型和指针类型
关于引用类型
slice(切片)的使用及实现原理
切片如何实现大小可变
切片的声明和定义
切片长度的扩展
切片容量的扩展
切片参数的复制
利用数组创建切片
利用切片创建切片
切片元素的修改
切片的循环处理
切片索引越界
总结切片操作的底层原理
map(映射)的使用及实现原理
声明和创建map
遍历map中的元素
元素查找与避免二义性
删除元素
map的存储结构解析
map元素的定位原理解析
map的容量扩展原理解析
channel(通道)的使用及实现原理
channel的使用
channel的实现原理
channel与消息队列、协程通信的对比
自定义结构体
自定义数据类型和自定义结构体
自定义结构体的使用
利用new创建实例
从自定义结构体看访问权限控制
自描述的访问权限
编程范例——结构体使用实例
利用自定义结构体实现bitmap
利用timer.Ticker实现定时任务
流程控制
分支控制
if语句实现分支控制
switch语句实现分支控制
分支控制的本质是向下跳转
避免多层if嵌套的技巧
循环控制
for循环
for-range循环
循环控制的本质是向上跳转
循环和递归的区别
跳转控制
goto关键字的使用
goto的本质是任意跳转
编程范例——流程控制的灵活使用
for循环的误区
switch-case的灵活使用
当前位置:
首页>>
技术小册>>
深入浅出Go语言核心编程(二)
小册名称:深入浅出Go语言核心编程(二)
### 流程控制 在编程的世界里,流程控制是构建程序逻辑框架的基石。它决定了代码的执行顺序、条件判断以及循环迭代等关键行为。对于《深入浅出Go语言核心编程(二)》这本书而言,深入理解并灵活运用Go语言的流程控制机制,是编写高效、可读性强程序的关键。本章将深入剖析Go语言中的流程控制语句,包括条件判断(if-else)、循环(for、range)、以及跳转语句(break、continue、goto、defer和panic/recover),帮助读者在复杂逻辑中游刃有余。 #### 一、条件判断:if-else Go语言中的条件判断主要通过`if`、`else if`、`else`语句实现,它们允许程序根据条件表达式的真假来决定执行哪段代码。`if`语句的基本语法如下: ```go if 条件表达式 { // 条件为真时执行的代码 } else if 另一个条件表达式 { // 第一个条件为假且这个条件为真时执行的代码 } else { // 所有条件都不满足时执行的代码 } ``` **示例**: ```go package main import "fmt" func main() { score := 85 if score >= 90 { fmt.Println("优秀") } else if score >= 60 { fmt.Println("及格") } else { fmt.Println("不及格") } } ``` 在这个例子中,根据分数的高低,程序会输出不同的成绩等级。 #### 二、循环:for与range Go语言提供了两种主要的循环结构:`for`循环和`range`循环。 ##### 2.1 for循环 `for`循环是Go中最灵活的循环结构,它可以以多种形式出现,包括传统的初始化语句、条件表达式和迭代语句形式,以及更简洁的“无限循环”和“仅条件表达式”形式。 **传统形式**: ```go for 初始化语句; 条件表达式; 迭代语句 { // 循环体 } ``` **无限循环**: ```go for { // 循环体 } ``` 或 ```go for ;; { // 循环体 } ``` **仅条件表达式**: ```go for 条件表达式 { // 循环体 } ``` **示例**: ```go package main import "fmt" func main() { for i := 0; i < 5; i++ { fmt.Println(i) } // 无限循环示例(注意:实际编程中应避免使用无限循环,除非有明确的退出条件) /* for { // ... } */ } ``` ##### 2.2 range循环 `range`循环特别适用于遍历数组、切片、字符串、映射(map)以及通道(channel)等集合类型。它返回两个值:索引和对应元素的值(对于映射则是键和值)。 **示例**: ```go package main import "fmt" func main() { nums := []int{2, 3, 4} for index, value := range nums { fmt.Printf("Index: %d, Value: %d\n", index, value) } // 遍历字符串 str := "hello" for index, char := range str { fmt.Printf("Index: %d, Char: %c\n", index, char) } } ``` #### 三、跳转语句 在Go语言中,跳转语句用于改变程序执行的正常流程,包括`break`、`continue`、`goto`,以及特殊的`defer`和错误处理机制`panic`/`recover`。 ##### 3.1 break与continue - `break`语句用于立即退出当前循环(`for`、`switch`或`select`)。如果`break`后面紧跟一个标签(label),则退出到该标签所标识的循环或`switch`语句。 - `continue`语句用于跳过当前循环的剩余部分,直接进入下一次迭代。同样,如果`continue`后面有标签,则跳转到该标签处的下一次迭代。 **示例**: ```go package main import "fmt" func main() { for i := 0; i < 10; i++ { if i%2 == 0 { continue // 跳过偶数 } fmt.Println(i) if i == 5 { break // 退出循环 } } } ``` ##### 3.2 goto 尽管`goto`语句在大多数现代编程语言中被视为“有害”或至少是不推荐使用的,但在Go中,它仍被保留作为一种有限用途的工具,主要用于跳出多层嵌套循环或实现某些特定的跳转逻辑。 **示例**(谨慎使用): ```go package main import "fmt" func main() { i := 0 OuterLoop: for i < 10 { for j := 0; j < 10; j++ { if j == 5 { goto OuterLoop // 跳出外层循环 } fmt.Println(i, j) } i++ } } ``` ##### 3.3 defer、panic与recover 这三个关键字共同构成了Go语言独特的错误处理机制。 - `defer`语句会延迟函数的执行直到包含它的函数即将返回。这常用于资源的清理工作,如文件关闭、解锁等。 - `panic`是一个内建函数,用于中断函数的执行,并开始逐层向上执行函数中的`defer`语句。如果`panic`没有被`recover`捕获,程序将崩溃并打印错误信息。 - `recover`是一个内建函数,用于捕获`panic`,阻止程序崩溃,并获取`panic`的值。它通常与`defer`结合使用,在函数或方法的顶部使用`defer func() { ... }()`来捕获和处理可能发生的`panic`。 **示例**: ```go package main import "fmt" func testPanic() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from", r) } }() panic("Something went wrong!") } func main() { testPanic() fmt.Println("Program continues...") } ``` 在这个例子中,尽管`testPanic`函数中发生了`panic`,但由于有`defer`和`recover`的存在,程序并没有崩溃,而是输出了“Recovered from Something went wrong!”并继续执行。 #### 结语 流程控制是编程中的基础而强大的工具,它让程序能够根据条件、循环和错误处理来灵活应对各种情况。在Go语言中,通过`if-else`、`for`/`range`循环以及`break`、`continue`、`goto`、`defer`、`panic`/`recover`等跳转语句和错误处理机制,我们可以构建出既高效又易于维护的程序。希望本章内容能帮助你更好地掌握Go语言的流程控制,从而在编程之路上走得更远。
上一篇:
利用timer.Ticker实现定时任务
下一篇:
分支控制
该分类下的相关小册推荐:
深入浅出Go语言核心编程(八)
Go 组件设计与实现
Go开发权威指南(上)
深入浅出Go语言核心编程(七)
Golang并发编程实战
go编程权威指南(二)
深入浅出Go语言核心编程(一)
go编程权威指南(三)
Go Web编程(上)
企业级Go应用开发从零开始
Go Web编程(下)
Go语言从入门到实战