GO语言Defer用法实例分析
作者:niuniu 时间:2024-04-23 09:49:01
本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下:
defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。
这样延迟一个函数有双重优势:一是你永远不会忘记关闭文件,此错误在你事后编辑函数添加一个返回路径时常常发生。二是关闭和打开靠在一起,比放在函数尾要清晰很多。
/**
* Created with IntelliJ IDEA.
* To change this template use File | Settings | File Templates.
* Name:Defer
*/
package main
import (
"fmt"
"os"
"log"
"io"
)
//将文件内容作为一个字符串返回
func Contents(filename string) (string) {
//打开文件
f, err := os.Open(filename)
if err != nil {
log.Printf("%s",err)
}
fmt.Println("Close前>",f)
// 如果f.Close在这里执行时就完了。所以用DEFER延时执行
// 他应该会在f.Read()接收完后执行 (我个人理解)
defer f.Close()
fmt.Println("Close后>",f)
var result []byte
buf := make([]byte, 100)
for {
n, err := f.Read(buf[0:])
result = append(result, buf[0:n]...)
if err != nil {
if err == io.EOF {
break
}
log.Printf("未接收完关闭了f>%s",err) // 如果f提前关闭了,打印
}
}
return string(result)
}
func main() {
fileurl := os.Getenv("HOME")
filename := fileurl+"/test.txt"
fmt.Println(Contents(filename))
}
我们可以更好的利用被延迟执行函数时特点
/**
* Created with IntelliJ IDEA.
* To change this template use File | Settings | File Templates.
* Name:Defer
*/
package main
import (
"fmt"
)
func trace(s string) string {
fmt.Println("entering:", s)
return s
}
func un(s string) {
fmt.Println("leaving:", s)
}
func a() {
defer un(trace("a"))
fmt.Println("in a")
}
func b() {
defer un(trace("b"))
fmt.Println("in b")
a()
}
func main() {
b()
}
希望本文所述对大家的Go语言程序设计有所帮助。
标签:GO语言,Defer,用法
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python连接mysql方法及常用参数
2024-01-15 00:33:54
当前流行的JavaScript代码风格指南
2024-04-22 13:10:08
Python实战之疫苗研发情况可视化
2023-08-19 15:29:35
![](https://img.aspxhome.com/file/2023/4/102924_0s.png)
python 函数中的参数类型
2022-11-16 10:51:28
python 读取数据库并绘图的实例
2024-01-27 10:43:33
Python 生成多行重复数据的方法实现
2022-07-26 18:56:07
linux下python中文乱码解决方案详解
2023-09-01 03:53:04
![](https://img.aspxhome.com/file/2023/3/125033_0s.png)
Python日志模块logging的使用方法总结
2023-05-10 03:28:45
![](https://img.aspxhome.com/file/2023/2/76192_0s.png)
Python实现快速傅里叶变换的方法(FFT)
2022-09-18 07:21:47
![](https://img.aspxhome.com/file/2023/3/77873_0s.png)
mysql如何通过当前排序字段获取相邻数据项
2024-01-13 02:24:25
Ubuntu16.04安装python3.6.5步骤详解
2023-01-01 08:06:58
用我喜欢的字体(Cufon)
2009-12-11 18:51:00
Vue组件间的通信方式详析
2024-05-09 15:12:29
![](https://img.aspxhome.com/file/2023/4/126554_0s.png)
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2024-05-02 17:32:09
![](https://img.aspxhome.com/file/2023/8/129558_0s.png)
document.createElement()用法及注意事项
2008-04-21 15:16:00
Navicat for SQLite导入csv中文数据的方法
2024-01-22 18:56:26
![](https://img.aspxhome.com/file/2023/1/110341_0s.jpg)
python并发编程多进程 互斥锁原理解析
2023-04-07 04:06:34
golang函数的返回值实现
2024-04-23 09:47:52
利用Pygame制作躲避僵尸游戏
2023-07-10 20:53:12
![](https://img.aspxhome.com/file/2023/2/130972_0s.png)
jQuery事件的绑定、触发、及监听方法简单说明
2024-02-24 12:50:53