Go语言defer

Go语言defer教程

Go 语言defer 语句 一般都是用来处理需要关闭的资源。如果同一个 函数 中,既有 defer 语句,同时也有 return 语句,那么 defer 语句会在 return 语句的后面执行。

案例

Go语言defer语句关闭文件

使用 defer 语句,延迟执行关闭打开的文件

package main import ( "fmt" "os" ) func fileInfo(fileName string) (fileInfo os.FileInfo) { var( file *os.File err error ) if file, err = os.Open(fileName); err != nil { return nil } defer file.Close() if fileInfo, err = file.Stat();err != nil { return nil } return } func main() { fmt.Println("嗨客网(www.haicoder.net)") //使用 defer 语句,延迟执行关闭打开的文件 fileInfo := fileInfo("tmp.txt") if fileInfo == nil{ return } fileName := fileInfo.Name() fileSize := fileInfo.Size() fmt.Println("FileName =",fileName, "FileSize =", fileSize) }

程序运行后,控制台输出如下:

27_golang defer.png

我们定义了一个 fileInfo 函数,该函数的 参数类型 是一个 string 类型 的文件名,函数返回 的数据类型是文件信息类型,该函数最终实现了获取指定文件的信息。

在该函数里,我们首先打开文件,打开成功之后,紧接着就使用 defer 语句关闭打开的文件,至此,不管该函数下面什么时候执行 return 语句,我们的 defer 关闭文件的动作都会被执行,因此这里使用 defer 语句确保了文件的关闭操作。

最后,在 main 函数里面,我们调用函数,并获取了文件的文件名和文件大小信息。

Go语言defer与return

go 语言的 defer 语句,会在 return 语句之后执行

package main import ( "fmt" ) func deferReturn()(ret int){ defer func(){ ret++ }() return 10 } func main() { fmt.Println("嗨客网(www.haicoder.net)") //go语言的 defer 语句,会在 return 语句之后执行 ret := deferReturn() fmt.Println("Ret =", ret) }

程序运行后,控制台输出如下:

28_golang defer.png

我们定义了一个 deferReturn 函数,该函数返回一个 int类型的返回值。在该函数里,我们使用了 defer 对 具名返回值 做了加一的操作,同时最后,我们返回 10。

最后,在 main 函数里面,我们调用函数,发现最终打印了 11,而不是 10,说明我们的 defer 语句是在 return之后执行的,是对原本的 10 加了 1,再返回。

Go语言defer教程总结

Go 语言的 defer 语句 一般都是用来处理需要关闭的资源。如果同一个函数中,既有 defer 语句,同时也有 return 语句,那么 defer 语句会在 return 语句的后面执行。