Golang 使用延迟关键字

Golang 使用延迟关键字

Go 中, defer 关键字的主要用途是用于清理打开的文件、网络连接、数据库句柄等使用的资源。这有助于通过使关闭函数/文件的调用接近打开语句的调用来减少错误的机会。跟随延迟关键字的语句被放置到一个堆栈上,最后按照后进先出 (LIFO) 的顺序调用它们。

示例:

package main

import "fmt"

func main() {
    defer fmt.Println("First")
    defer fmt.Println("Second")
    fmt.Println("Last")
} 
Go

输出:

Last
Second
First
Go

在这里,您可以看到语句根据 LIFO 的顺序打印。但这不是 defer 的目的,因此我们将查看一个程序以了解 defer 关键字的主要用途。

示例:

func write(fileName string, text string) error {
    file, err := os.Create(fileName)
    if err != nil {
        return err
    }
    _, err = io.WriteString(file, text)
    if err != nil {
        return err
    }
    file.Close()
    return nil
}
Go

若 io.WriteString 函数失败,则程序将返回错误 “err”,并且无法关闭文件,这将导致资源的浪费,因此在这里 defer 就非常有用了。

func write(fileName string, text string) error {
    file, err := os.Create(fileName)
    if err != nil {
        return err
    }

 // 无论程序通过什么,该语句肯定会在最后运行。
    defer file.Close()

    _, err = io.WriteString(file, text)
    if err != nil {
        return err
    }

    return file.Close()
}
Go

在此程序中,defer file.Close() 语句将在函数的末尾运行,如果程序出现错误,则它将能够关闭早先在程序中打开的文件,并因此节省资源。以下是相同的完整程序。

package main

import (
    "io"
    "log"
    "os"
)

func main() {
    if err := write("readme.txt", "This is a readme file"); err != nil {
        log.Fatal("failed to write file:", err)

    }
}

func write(fileName string, text string) error {
    file, err := os.Create(fileName)
    if err != nil {
        return err
    }
    defer file.Close()
    _, err = io.WriteString(file, text)
    if err != nil {
        return err
    }

    return file.Close()
} 
Go

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册