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

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。