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)) }