Go 流程控制
Go 流程控制
Go 语言提供了多种流程控制结构,用于控制程序的执行流程。主要包括:
- 条件语句:
if-else - 选择语句:
switch-case - 循环语句:
for - 跳转语句:
- 无条件跳转:
goto - 条件跳转:
break和continue
- 无条件跳转:
- 延迟语句:
defer - 异常处理:
panic和recover
一、if-else 条件语句
语法:
1 | if 条件 1 { |
示例:
1 | package main |
二、switch-case 选择语句
语法:
1 | switch 表达式 { |
示例:
1 | package main |
当 case 使用关键字 fallthrough 开启穿透能力的时候,case 匹配成功后会继续执行下一个 case 的代码(fallthrough 只能穿一层),而不进行条件判断,直到遇到 break 或 switch 结束为止。
1 | s := "hello" |
三、for 循环语句
Go 语言只有 for 关键字,没有 while 或 do-while。
语法:
1 | for [condition | (init; condition; increment) | Range] { |
- 可以看到 for 后面可以接三种表达式:
- 接一个条件表达式,类似 while 循环
- 接三个表达式,类似传统的 for 循环
- 接 range 关键字,遍历数组、切片、字符串、Map 等
- 如果不接表达式,等价于无限循环
示例:
1 | package main |
四、跳转语句
4.1 goto 无条件跳转语句
goto 语句用于无条件跳转到函数内的某个标签位置,标签由一个标识符和冒号 : 组成。
goto 可以跳转到同一函数内的任何位置,但不能跳转到其他函数。
语法:
1 | goto 标签 |
示例:
1 | package main |
4.2 break 跳转语句
break 语句用于跳出当前循环或 switch 语句块,结束当前循环或 switch 的执行。
示例:
1 | for i := 0; i < 5; i++ { |
4.3 continue 跳转语句
continue 语句用于跳过当前循环的剩余代码,直接进入下一次循环的判断。
示例:
1 | for i := 0; i < 5; i++ { |
五、defer 延迟语句
defer 语句用于注册一个函数调用,这个调用会在包含它的函数执行结束后被自动执行,无论函数是正常返回还是因为 panic 而终止。
语法:
1 | defer 函数调用 |
示例:
1 | func main() { |
defer 核心用途:
- 文件操作:确保文件句柄被关闭:
defer file.Close() - 数据库连接:确保数据库连接被释放:
defer db.Close() - 锁机制:确保锁被释放:
defer mutex.Unlock()
注意
- defer 语句的参数是在 defer 语句被定义时立即求值的,而不是在它被执行时
1
2
3
4
5
6
7
8
9
10
11
12
13func main() {
i := 1
// defer 语句被定义时,i 的值是 1,所以参数 i 立即被求值并固定为 1。
defer fmt.Println("defer 结果:", i)
i++ // i 的值现在是 2,但这不影响 defer 语句的参数 i。
fmt.Println("main 结束前 i:", i)
// 输出顺序:
// 1. main 结束前 i: 2
// 2. defer 结果: 1 <-- 打印的是 i 声明时的值 1
}
六、panic 和 recover 异常处理
6.1 panic 抛出异常
panic 是一个内置函数,用于中断正常的流程控制
- 当函数
func中执行panic时,func之后的代码将不再执行 panic会沿着调用栈向上传播,执行当前 Goroutine 中所有已注册的defer函数- 如果调用栈上的所有
defer函数都执行完毕,但panic仍未被捕获,程序将打印堆栈信息并崩溃退出。
示例:
1 | func main() { |
6.2 recover 捕获异常
recover 是一个内置函数,必须在 defer 函数中调用,才能捕获到 panic 抛出的错误,并阻止程序崩溃。
- 有效调用: 在
defer函数内直接调用recover() - 作用: 如果一个
panic正在进行,recover会捕获到panic的参数(即panic()函数的参数),并终止panic过程,让程序恢复正常执行流程 - 恢复位置:捕获
panic后,程序不会回到panic发生的点,而是继续执行defer之后的代码
示例:
1 | package main |