当前位置: 首页 > 编程笔记 >

GO语言Defer用法实例分析

仲孙兴旺
2023-03-14
本文向大家介绍GO语言Defer用法实例分析,包括了GO语言Defer用法实例分析的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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用法分析,包括了GO语言延迟函数defer用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下: defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放资源、清理数据、记录日志等。这有点

  • 本文向大家介绍Go语言map字典用法实例分析,包括了Go语言map字典用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言map字典用法。分享给大家供大家参考。具体分析如下: 这段代码生成了青岛、济南、烟台三个城市拼音和汉字的对照字典,根据拼音可以输出汉字 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言中的range用法实例分析,包括了Go语言中的range用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言中的range用法。分享给大家供大家参考。具体如下: for 循环的 range 格式可以对 slice 或者 map 进行迭代循环。 可以将值赋值给 _ 来忽略键名和值。 如果只需要索引值,去掉“, value”的部分即可。 希望本文所述对大家

  • 本文向大家介绍Go语言MessageBox用法实例,包括了Go语言MessageBox用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言MessageBox用法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍go语言base64用法实例,包括了go语言base64用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言base64用法。分享给大家供大家参考。具体如下: 这里展示golang base64 的一个小例子,代码如下: 发现了一个更好的办法: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍go语言使用scp的方法实例分析,包括了go语言使用scp的方法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言使用scp的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言接口用法实例,包括了Go语言接口用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言接口用法。分享给大家供大家参考。具体分析如下: 接口类型是由一组方法定义的集合。 接口类型的值可以存放实现这些方法的任何值。 希望本文所述对大家的Go语言程序设计有所帮助。

  • 主要内容:多个延迟执行语句的处理顺序,使用延迟执行语句在函数退出时释放资源Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。 关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者