Go 语言 的 defer 语句 一般都是用来处理需要关闭的资源。如果同一个 函数 中,既有 defer 语句,同时也有 return 语句,那么 defer 语句会在 return 语句的后面执行。
使用 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)
}
程序运行后,控制台输出如下:
我们定义了一个 fileInfo 函数,该函数的 参数 的 类型 是一个 string 类型 的文件名,函数返回 的数据类型是文件信息类型,该函数最终实现了获取指定文件的信息。
在该函数里,我们首先打开文件,打开成功之后,紧接着就使用 defer 语句关闭打开的文件,至此,不管该函数下面什么时候执行 return 语句,我们的 defer 关闭文件的动作都会被执行,因此这里使用 defer 语句确保了文件的关闭操作。
最后,在 main 函数里面,我们调用函数,并获取了文件的文件名和文件大小信息。
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)
}
程序运行后,控制台输出如下:
我们定义了一个 deferReturn 函数,该函数返回一个 int类型的返回值。在该函数里,我们使用了 defer 对 具名返回值 做了加一的操作,同时最后,我们返回 10。
最后,在 main 函数里面,我们调用函数,发现最终打印了 11,而不是 10,说明我们的 defer 语句是在 return之后执行的,是对原本的 10 加了 1,再返回。
Go 语言的 defer 语句 一般都是用来处理需要关闭的资源。如果同一个函数中,既有 defer 语句,同时也有 return 语句,那么 defer 语句会在 return 语句的后面执行。