Golang defer延迟语句详解
在Golang中,defer语句会延迟到包含它的函数退出时才执行。这种特性常被用于资源清理、文件关闭、解锁等场景。
- 基本用法
func a() {
fmt.Println("Inside a")
defer fmt.Println("Defer in a")
}
func main() {
a()
}
这将输出:
Inside a
Defer in a
- 多个defer语句
func a() {
fmt.Println("Inside a")
defer fmt.Println("First defer in a")
defer fmt.Println("Second defer in a")
}
func main() {
a()
}
这将输出:
Inside a
Second defer in a
First defer in a
注意,defer后的表达式是在函数退出时执行的,而不是在语句执行时执行的。
- 带有参数的defer
func a(x int) {
defer fmt.Println("Defer with parameter:", x)
x++
defer fmt.Println("Defer with parameter:", x)
}
func main() {
a(10)
}
这将输出:
Defer with parameter: 12
Defer with parameter: 11
注意,defer后的表达式参数是在defer执行时确定的,而不是在注册时确定的。
- 使用匿名函数延迟关闭资源
func readFile(path string) (err error) {
file, err := os.Open(path)
if err != nil {
return err
}
defer func() {
if e := file.Close(); e != nil {
err = e
}
}()
// ...
return nil
}
这个例子中,我们使用匿名函数来确保文件在函数退出时关闭,而不是在文件读取完毕时关闭。这样可以保证即使在读取文件过程中发生错误,文件也会关闭。
- 使用defer执行清理操作
func readFile(path string) (err error) {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
// ...
return nil
}
在这个例子中,我们使用了内置的Close方法,这样代码更加简洁易读。
- 使用defer解锁
func lockFile(path string) (err error) {
file, err := os.Open(path)
if err != nil {
return err
}
fileMutex.Lock()
defer fileMutex.Unlock()
// ...
return nil
}
在这个例子中,我们使用defer来确保无论函数是正常结束还是发生错误,文件锁都将被释放。
评论已关闭