源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

GO语言Defer用法实例分析

  • 时间:2022-07-05 03:42 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:GO语言Defer用法实例分析
本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下: defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。 这样延迟一个函数有双重优势:一是你永远不会忘记关闭文件,此错误在你事后编辑函数添加一个返回路径时常常发生。二是关闭和打开靠在一起,比放在函数尾要清晰很多。
[u]复制代码[/u] 代码如下:
/**  * 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)) }
我们可以更好的利用被延迟执行函数时特点
[u]复制代码[/u] 代码如下:
/**  * 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语言程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部