Golang开发--defer关键字

defer是Go语言中的一个关键字,用于延迟执行函数或方法的调用。defer语句会将其后面的函数或方法调用推迟到当前函数返回之前执行,无论函数是正常返回还是发生异常。

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    fmt.Println("Hello, World!")
}

输出结果为:

Hello, World!
defer 2
defer 1

可以看到,"Hello, World!"是先输出的,而defer语句中的函数调用是在main函数返回之前执行的,且按照声明顺序的相反顺序执行。

defer的作用主要有以下几个方面:

  1. 资源释放:defer语句常用于释放资源,比如关闭文件、关闭数据库连接等。通过在打开资源后使用defer语句,可以确保在函数返回之前一定会执行资源释放操作,避免资源泄漏。
func readFile() {
    file, err := os.Open("filename.txt")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer file.Close()
    // 读取文件并进行其他操作
}

在上面的示例中,使用 defer 语句将 file.Close() 推迟到函数返回之前执行,无论函数返回时是正常执行还是发生错误,都能确保文件被关闭,避免资源泄漏。

2.解锁操作:在使用互斥锁(mutex)或读写锁(RWMutex)的情况下,使用 defer 语句延迟解锁,以避免忘记解锁而导致死锁。例如:

var mu sync.Mutex

func someFunction() {
    mu.Lock()
    defer mu.Unlock()
    // 临界区代码
}

在上面的示例中,使用 defer 语句将 mu.Unlock() 推迟到函数返回之前执行,确保在函数退出时解锁互斥锁。

  1. 错误处理:defer语句也可以用于处理错误。在函数中可能会发生多个错误,但只有最后一个错误需要处理,可以使用defer语句将错误处理代码推迟到函数返回之前执行,确保错误处理代码只会执行一次。
func process() error {
    err := setup()
    if err != nil {
        return err
    }
    defer cleanup()
    // 其他操作
    return nil
}

在上面的示例中,cleanup() 函数会在 process() 函数退出前被推迟执行,无论是正常返回还是发生错误。

  1. 日志记录:defer语句还可以用于记录日志。在函数中可能会有多个地方需要记录日志,但只需要在函数返回之前记录一次即可,可以使用defer语句将日志记录代码推迟到函数返回之前执行。

使用defer语句的方法如下:

  1. 在函数中使用defer语句时,需要在调用函数或方法的语句前面加上defer关键字。

  2. 可以使用多个defer语句,它们的执行顺序与声明顺序相反,即最后一个defer语句最先执行。

  3. defer语句中的函数或方法调用可以包含参数,这些参数会在defer语句执行时被计算并保存,但实际调用时会使用当前的参数值。

  4. defer 语句中的函数参数会在 defer 语句执行时求值,而不是在函数返回时求值。这意味着,如果 defer 语句中的函数调用有参数,参数的值在 defer 语句执行时就会被确定。

你可能感兴趣的:(go,golang,oracle,数据库)