GO语言Defer用法实例分析

2018-09-22 01:13

阅读:537

  本文实例讲述了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语言程序设计有所帮助。


评论


亲,登录后才可以留言!