本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。
目录
定义
应用场景
代码示例
改为匿名函数
总结
定义
延迟:关键字,可以用于修饰语句、函数,
确保这条语句可以在当前栈退出的时候执行。
应用场景
1.一般用于做资源清理工作
2.解锁、关闭文件
3.在同一个函数中多次调用defer,执行时类似于栈的机制:先后入后出
代码示例
创建文件读取函数,并设置读取的文件路径为当前路径下的for循环文件。
Defer函数可以保证文件关闭一定会被执行,不管自定义的函数出现异常还是错误。
示例如下:
package main
import (
"fmt"
"os"
)
func main() {
filename := "for循环.go"
readFile(filename)
}
func readFile(filename string) {
// func Open(name string) (*File, error) {}
// 1.go语言一般会将错误码作为最后一个参数返回
// 2.err一般nil代表没有错误,执行成功,非nil表示执行失败
f1, err := os.Open(filename)
defer f1.Close()
if err != nil {
fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)
return
}
buf := make([]byte, 1024)
// func (f *File) Read(b []byte) (n int, err error)
n, _ := f1.Read(buf)
fmt.Println("读取文件的实际长度:", n)
fmt.Println("读取文件的内容:", string(buf))
}
运行结果:
改为匿名函数
匿名函数,没有名字,属于一次性的逻辑类似于lamada表达式。
把defer的处理改为创建匿名函数,同时调用。
在一个方法或者函数中,可以有多个defer语句,
多个defer语句的执行顺序依照后进先出的原则。
示例如下:
package main
import (
"fmt"
"os"
)
func main() {
filename := "for循环.go"
readFile(filename)
}
func readFile(filename string) {
// func Open(name string) (*File, error) {}
// 1.go语言一般会将错误码作为最后一个参数返回
// 2.err一般nil代表没有错误,执行成功,非nil表示执行失败
f1, err := os.Open(filename)
// defer f1.Close()
defer func(a int) {
fmt.Println("准备关闭文件, code:", a)
_ = f1.Close()
}(100) // 创建一个匿名函数,同时调用
if err != nil {
fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)
return
}
defer fmt.Println("倒计时1")
defer fmt.Println("倒计时2")
defer fmt.Println("倒计时3")
buf := make([]byte, 1024)
// func (f *File) Read(b []byte) (n int, err error)
n, _ := f1.Read(buf)
fmt.Println("读取文件的实际长度:", n)
fmt.Println("读取文件的内容:", string(buf))
}
运行结果:
总结
本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。