GO语言---defer关键字

文章目录

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())
    
    // 耗时操作...
}
相关推荐
PinkSun几秒前
我用Spring AI做了个简历优化工具(1):Structured Output实战,让AI返回Java对象
后端
skywalk81638 分钟前
你希望的「多路捕获」语法是哪种形式?具体而言,「捕获 类型为 e」指的是什么?
开发语言·编程
东风微鸣18 分钟前
Argo CD 用户管理:本地用户配置与权限分离实践
git·后端
两年半的个人练习生^_^19 分钟前
JMM 进阶:彻底理解 volatile 实现原理
java·开发语言
晚风吹红霞21 分钟前
C++模板进阶:非类型参数、特化、分离编译与优缺点解析
开发语言·c++
Yeats_Liao22 分钟前
Java网络编程(五):Selector选择器与高并发实现
java·后端·架构
小小龙学IT28 分钟前
Go语言后端开发入门指南
开发语言·后端·golang
不会C语言的男孩28 分钟前
C++ Primer 第8章:IO 库
开发语言·c++
兰令水36 分钟前
leecodecode【层序遍历】【2026.6.3打卡-java版本】
java·开发语言
Halo_tjn37 分钟前
反射与设计模式2
java·开发语言·算法