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())
    
    // 耗时操作...
}
相关推荐
Coding小公仔5 分钟前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
程序猿阿伟6 分钟前
《声音的变形记:Web Audio API的实时特效法则》
开发语言·前端·php
凌览10 分钟前
有了 25k Star 的MediaCrawler爬虫库加持,三分钟搞定某红书、某音等平台爬取!
前端·后端·python
这里有鱼汤21 分钟前
给你的DeepSeek装上实时行情,让他帮你炒股
后端·python·mcp
咖啡啡不加糖23 分钟前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南26 分钟前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
ん贤1 小时前
RESTful风格
后端·go·restful
Humbunklung1 小时前
Rust方法语法:赋予结构体行为的力量
开发语言·后端·rust
萧曵 丶1 小时前
Rust 内存结构:深入解析
开发语言·后端·rust
Kookoos1 小时前
ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
数据库·分布式·后端·abp vnext·azure cosmos