GO语言Defer用法实例分析

花衰,有些事,你越是在乎,痛的就越厉害,放开了,看淡了,慢慢就淡化了。只是,我们总是事后才明白,懂生活,很难,会生活,更难。

本文实例讲述了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用法实例分析到此结束。人生是美好的,又是短暂的。有的人生寂寞,有的人生多彩,不同的人有着不同的人生追求;人生是一条没有回程的单行线,每个人都用自己的所有时光前行。小编再次感谢大家对我们的支持!

您可能有感兴趣的文章
浅谈go中defer的一个隐藏功能

Go语言中的延迟函数defer示例详解

golang中defer的关键特性示例详解

总结Go语言中defer的如何使用和注意要点

GO语言延迟函数defer用法分析