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