GO语言Defer用法实例分析

作者:niuniu 时间:2024-04-23 09:49:01 

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

标签:GO语言,Defer,用法
0
投稿

猜你喜欢

  • Python连接mysql方法及常用参数

    2024-01-15 00:33:54
  • 当前流行的JavaScript代码风格指南

    2024-04-22 13:10:08
  • Python实战之疫苗研发情况可视化

    2023-08-19 15:29:35
  • python 函数中的参数类型

    2022-11-16 10:51:28
  • python 读取数据库并绘图的实例

    2024-01-27 10:43:33
  • Python 生成多行重复数据的方法实现

    2022-07-26 18:56:07
  • linux下python中文乱码解决方案详解

    2023-09-01 03:53:04
  • Python日志模块logging的使用方法总结

    2023-05-10 03:28:45
  • Python实现快速傅里叶变换的方法(FFT)

    2022-09-18 07:21:47
  • mysql如何通过当前排序字段获取相邻数据项

    2024-01-13 02:24:25
  • Ubuntu16.04安装python3.6.5步骤详解

    2023-01-01 08:06:58
  • 用我喜欢的字体(Cufon)

    2009-12-11 18:51:00
  • Vue组件间的通信方式详析

    2024-05-09 15:12:29
  • 使用BootStrap和Metroui设计的metro风格微网站或手机app界面

    2024-05-02 17:32:09
  • document.createElement()用法及注意事项

    2008-04-21 15:16:00
  • Navicat for SQLite导入csv中文数据的方法

    2024-01-22 18:56:26
  • python并发编程多进程 互斥锁原理解析

    2023-04-07 04:06:34
  • golang函数的返回值实现

    2024-04-23 09:47:52
  • 利用Pygame制作躲避僵尸游戏

    2023-07-10 20:53:12
  • jQuery事件的绑定、触发、及监听方法简单说明

    2024-02-24 12:50:53
  • asp之家 网络编程 m.aspxhome.com