Files
go-basics/stage02-control-flow/04-defer/main.go
T

91 lines
1.7 KiB
Go
Raw Normal View History

2026-03-13 23:54:07 +08:00
package main
import "fmt"
func exercise1() {
fmt.Println("=== 练习1:defer基本用法 ===")
// 使用defer,在函数结束时打印"函数结束"
2026-03-17 15:37:09 +08:00
defer fmt.Println("函数结束")
2026-03-13 23:54:07 +08:00
fmt.Println("函数执行中")
}
func exercise2() {
fmt.Println("\n=== 练习2:defer执行顺序 ===")
// 使用多个defer语句,按照1-2-3的顺序声明
// 观察输出的顺序(应该是3-2-1)
2026-03-17 15:37:09 +08:00
defer fmt.Print(1)
defer fmt.Print(2)
defer fmt.Print(3)
2026-03-13 23:54:07 +08:00
fmt.Println("正常执行")
}
func exercise3() int {
fmt.Println("\n=== 练习3:defer修改返回值 ===")
// 使用具名返回值result
// defer函数中将result修改为100
// return返回50
2026-03-17 15:37:09 +08:00
var result int = 100
2026-03-13 23:54:07 +08:00
defer func() {
2026-03-17 15:37:09 +08:00
result = 50
2026-03-13 23:54:07 +08:00
}()
2026-03-17 15:37:09 +08:00
return result
2026-03-13 23:54:07 +08:00
}
func exercise4() {
fmt.Println("\n=== 练习4:defer参数求值 ===")
i := 0
// 使用defer打印i的值
// 注意:defer声明时就对参数求值了
2026-03-17 15:37:09 +08:00
defer fmt.Println(i)
2026-03-13 23:54:07 +08:00
i = 10
fmt.Println("修改i为:", i)
}
func exercise5() {
fmt.Println("\n=== 练习5:实际场景 - 模拟资源管理 ===")
// 模拟打开资源
resource := "文件句柄"
fmt.Println("打开:", resource)
// 使用defer在函数结束时关闭资源
defer func() {
2026-03-17 15:37:09 +08:00
fmt.Println("关闭:", resource)
2026-03-13 23:54:07 +08:00
}()
fmt.Println("使用:", resource)
}
func exercise6() {
fmt.Println("\n=== 练习6:defer捕获变量的值 ===")
// 使用循环声明多个defer
// 每个defer捕获当前i的值并打印
// 提示:使用闭包或立即求值
for i := 1; i <= 3; i++ {
2026-03-17 15:37:09 +08:00
defer func(n int) {
2026-03-13 23:54:07 +08:00
fmt.Printf("defer输出: %d\n", n)
2026-03-17 15:37:09 +08:00
}(i)
2026-03-13 23:54:07 +08:00
fmt.Println("循环输出:", i)
}
}
func main() {
2026-03-17 15:37:09 +08:00
fmt.Println("=== defer 练习 ===")
2026-03-13 23:54:07 +08:00
exercise1()
exercise2()
fmt.Printf("练习3返回值: %d\n", exercise3())
exercise4()
exercise5()
exercise6()
}