GO语言Defer用法实例分析
本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下:
defer:调用一个被defer的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。
这样延迟一个函数有双重优势:一是你永远不会忘记关闭文件,此错误在你事后编辑函数添加一个返回路径时常常发生。二是关闭和打开靠在一起,比放在函数尾要清晰很多。
/**
*CreatedwithIntelliJIDEA.
*TochangethistemplateuseFile|Settings|FileTemplates.
*Name:Defer
*/
packagemain
import(
"fmt"
"os"
"log"
"io"
)
//将文件内容作为一个字符串返回
funcContents(filenamestring)(string){
//打开文件
f,err:=os.Open(filename)
iferr!=nil{
log.Printf("%s",err)
}
fmt.Println("Close前>",f)
//如果f.Close在这里执行时就完了。所以用DEFER延时执行
//他应该会在f.Read()接收完后执行(我个人理解)
deferf.Close()
fmt.Println("Close后>",f)
varresult[]byte
buf:=make([]byte,100)
for{
n,err:=f.Read(buf[0:])
result=append(result,buf[0:n]...)
iferr!=nil{
iferr==io.EOF{
break
}
log.Printf("未接收完关闭了f>%s",err) //如果f提前关闭了,打印
}
}
returnstring(result)
}
funcmain(){
fileurl:=os.Getenv("HOME") filename:=fileurl+"/test.txt" fmt.Println(Contents(filename)) }