文章目录
defer是Go语言中一个非常有用的关键字,它用于延迟函数的执行,直到包含它的函数返回之前。
基本用法
在函数被退出的时候执行defer后面的内容。
bash
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
// 输出:
// hello
// world
主要特性
1、延迟执行:defer语句会将函数调用推入一个栈中,当外层函数返回时,这些调用会按照后进先出(LIFO)的顺序执行。
2、参数立即求值:defer语句中的参数会在声明时立即求值,而不是在函数执行时。
bash
func main() {
i := 1
defer fmt.Println("Deferred print:", i)
i++
fmt.Println("Normal print:", i)
}
// 输出:
// Normal print: 2
// Deferred print: 1
3、栈式执行:多个defer语句会按照后进先出的顺序执行。
bash
func main() {
defer fmt.Println("first")
defer fmt.Println("second")
defer fmt.Println("third")
}
// 输出:
// third
// second
// first
常见用途
1、资源清理:如关闭文件、解锁互斥锁等。
bash
func readFile(filename string) (string, error) {
f, err := os.Open(filename)
if err != nil {
return "", err
}
defer f.Close() // 确保文件会被关闭
// 读取文件内容...
}
2、错误处理:可以与命名返回值结合使用。
bash
func doSomething() (err error) {
defer func() {
if err != nil {
// 错误处理逻辑
log.Printf("doSomething failed: %v", err)
}
}()
// 函数逻辑...
}
3、性能测量:
bash
func slowOperation() {
defer func(start time.Time) {
log.Printf("slowOperation took %v", time.Since(start))
}(time.Now())
// 耗时操作...
}