首页
技术小册
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)、以及更高级的控制流结构如switch语句和defer/panic/recover错误处理机制。 #### 一、条件判断:if-else的艺术 **1.1 基本if-else结构** Go语言中的`if-else`语句是最基础也是最常用的条件判断结构。它允许程序根据条件表达式的真假执行不同的代码块。 ```go package main import "fmt" func main() { x := 10 if x > 5 { fmt.Println("x 大于 5") } else { fmt.Println("x 不大于 5") } } ``` **1.2 嵌套if-else** 当需要基于多个条件进行更复杂的判断时,可以使用嵌套的`if-else`结构。 ```go if condition1 { // 处理条件1为真时的情况 if condition2 { // 处理条件1和条件2都为真时的情况 } else { // 处理条件1为真但条件2为假时的情况 } } else { // 处理条件1为假时的情况 } ``` **1.3 if语句的简短形式** 当`if`语句仅需要执行一条语句时,可以省略花括号`{}`,使代码更简洁。 ```go if x > 5 { fmt.Println("x 大于 5") } ``` **1.4 使用逻辑运算符组合条件** `&&`(逻辑与)、`||`(逻辑或)和`!`(逻辑非)等逻辑运算符可以组合多个条件表达式,实现更复杂的逻辑判断。 ```go if x > 5 && x < 10 { fmt.Println("x 在 5 和 10 之间") } ``` #### 二、循环控制:for与range的妙用 **2.1 for循环基础** Go语言中的`for`循环非常灵活,不仅可以作为传统的C风格循环(初始化语句;条件表达式;迭代语句),还可以作为while循环或无限循环使用。 ```go // C风格for循环 for i := 0; i < 10; i++ { fmt.Println(i) } // while风格for循环 i := 0 for i < 10 { fmt.Println(i) i++ } // 无限循环 for { // 需要某种条件来跳出循环 } ``` **2.2 range遍历** `range`关键字用于遍历数组、切片、字符串、映射(map)或通道(channel)的元素。它返回两个值:索引和该索引处的值(对于映射,返回键和值)。 ```go 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) } ``` **2.3 跳出循环:break与continue** `break`语句用于立即退出循环,而`continue`语句则跳过当前循环的剩余部分,直接进入下一次迭代。 ```go for i := 0; i < 10; i++ { if i == 5 { break // 退出循环 } if i%2 == 0 { continue // 跳过偶数 } fmt.Println(i) } ``` #### 三、switch语句的多面性 **3.1 基本用法** `switch`语句在Go中是一种多路分支语句,它比一系列的`if-else if-else`语句更清晰、更易读。 ```go switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: // freebsd, openbsd, // plan9, windows... fmt.Printf("%s.\n", os) } ``` **3.2 无表达式的switch** `switch`后面可以不跟任何表达式,此时它类似于多个`if-else`语句,但每个`case`后面都需要跟一个表达式。 ```go switch { case x < 0: fmt.Println("x is negative") case x == 0: fmt.Println("x is zero") case x > 0: fmt.Println("x is positive") } ``` **3.3 fallthrough关键字** 在Go的`switch`中,默认情况下,一旦某个`case`匹配成功,就会执行该`case`后的代码块,然后跳出`switch`。若希望继续执行下一个`case`的代码块,可以使用`fallthrough`关键字。 ```go switch { case x == 1: fmt.Println("x is 1") fallthrough case x == 2: fmt.Println("x is 1 or 2") } ``` #### 四、错误处理:defer、panic与recover **4.1 defer语句** `defer`语句会延迟函数的执行直到包含它的函数即将返回。这常用于资源的释放、文件的关闭、解锁以及记录时间等场景。 ```go func a() { defer fmt.Println("world") fmt.Println("hello") } // 输出: // hello // world ``` **4.2 panic与recover** `panic`用于中断函数的执行,并开始逐层向上执行函数中的延迟(deferred)函数。如果所有的延迟函数都执行完毕且`panic`仍未被处理(即没有通过`recover`捕获),则程序会崩溃并打印出传递给`panic`的值。 `recover`是一个内置的函数,它用来恢复由`panic`触发的崩溃,让程序可以从`panic`中恢复过来,并继续执行。它通常与`defer`结合使用。 ```go func b() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in b", r) } }() fmt.Println("Calling c") c() } func c() { panic("panic in c") } func main() { b() fmt.Println("Returned normally from b") } // 输出: // Calling c // Recovered in b panic in c // Returned normally from b ``` 通过上述编程范例,我们深入探讨了Go语言中流程控制的灵活使用,从基础的`if-else`、`for`循环到高级的`switch`语句和错误处理机制`defer`、`panic`、`recover`,展示了如何在不同场景下选择合适的控制流结构来编写高效、可读的代码。掌握这些技巧,将极大提升你的Go语言编程能力。
上一篇:
goto的本质是任意跳转
下一篇:
for循环的误区
该分类下的相关小册推荐:
深入浅出Go语言核心编程(四)
go编程权威指南(一)
从零写一个基于go语言的Web框架
深入浅出Go语言核心编程(五)
Go语言从入门到实战
Golang修炼指南
Go开发权威指南(上)
Go开发权威指南(下)
Go开发基础入门
Go Web编程(中)
深入浅出Go语言核心编程(一)
深入解析go语言