欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > Go语言 Defer(延迟)

Go语言 Defer(延迟)

2024/10/24 11:12:43 来源:https://blog.csdn.net/json_ligege/article/details/141143515  浏览:    关键词:Go语言 Defer(延迟)

 本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。

目录

定义

应用场景

代码示例

改为匿名函数

总结


定义

延迟:关键字,可以用于修饰语句、函数,

确保这条语句可以在当前栈退出的时候执行。

应用场景

1.一般用于做资源清理工作

2.解锁、关闭文件

3.在同一个函数中多次调用defer,执行时类似于栈的机制:先后入后出

代码示例

创建文件读取函数,并设置读取的文件路径为当前路径下的for循环文件。

Defer函数可以保证文件关闭一定会被执行,不管自定义的函数出现异常还是错误。

示例如下:

package mainimport ("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 mainimport ("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的示例。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com