📜  使用 defer 关键字的 Golang 程序(1)

📅  最后修改于: 2023-12-03 14:49:38.647000             🧑  作者: Mango

使用 defer 关键字的 Golang 程序

在 Golang 中,defer 关键字用于在函数退出之前执行某个操作。该关键字可以用于关闭文件、释放锁、回收资源等等。本文将介绍 defer 关键字的使用方法以及一些常见的应用场景。

基本语法

defer 关键字后面跟随一个函数调用,该函数将在包含 defer 语句的函数退出之前被调用。以下是 defer 关键字的基本语法:

func someFunc() {
    // ... 函数代码 ...
    
    defer functionCall()

    // ... 函数代码 ...
}

在上面的示例中,functionCall 函数将在 someFunc 函数退出之前被调用。可以将 defer 语句放置在函数中的任何位置,它们将按照后进先出(LIFO)的顺序执行。

常见应用场景
1. 资源释放

使用 defer 关键字可以方便地释放资源,例如关闭文件、关闭数据库连接、释放锁等。下面是一个使用 defer 关闭文件的示例:

func readFile() error {
    file, err := os.Open("file.txt")
    if err != nil {
        return err
    }
    defer file.Close()

    // ... 对文件的操作 ...

    return nil
}

在上述示例中,使用 defer 关键字关闭了文件,无论函数是否出现错误,文件都将被正确关闭。

2. 计时器

另一个常见的应用场景是使用 defer 创建简单的计时器。可以使用 time.Now() 记录开始时间,并在函数退出时使用 defer 输出函数执行时间。例如:

func someFunc() {
    start := time.Now()
    defer func() {
        fmt.Println("执行时间:", time.Since(start))
    }()

    // ... 函数代码 ...
}

在上述示例中,使用 defer 关键字创建了一个匿名函数来输出函数的执行时间。

3. 错误处理

defer 也可以用于错误处理,尤其是在涉及到锁的操作时。可以使用 defer 关键字在函数退出前释放锁,以防止忘记释放锁导致的死锁问题。例如:

func someFunc() {
    mu.Lock()
    defer mu.Unlock()

    // ... 对共享资源的操作 ...
}

在上述示例中,使用 defer 关键字确保在函数退出前释放锁。

总结

使用 defer 关键字可以在函数退出之前执行一些操作,如释放资源、计时等。它是 Golang 中一种非常方便的语法,可用于简化代码并确保资源的正确释放。希望本文对你理解并使用 defer 关键字有所帮助。

参考文档:https://golang.org/ref/spec#Defer_statements