• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang学习笔记之延迟函数(defer)的使用小结

    golang的defer优雅又简洁, 是golang的亮点之一。defer在声明时不会立即执行,而是在函数return后,再按照先进后出的原则依次执行每个defer,一般用于释放资源、清理数据、记录日志、异常处理等。

    关键字defer于注册延迟调用。这些调用直到 ret 前才被执行,通常用于释放资源或错误处理。

    一、当defer被声明时,其参数就会被实时解析

    func a() {
      i := 0
      defer fmt.Println(i) //输出0,因为i此时就是0
      i++
      defer fmt.Println(i) //输出1,因为i此时就是1
      return
    }
    

    二、当一个函数内多次调用 defer 时,Go 会把 defer 调用放入到一个栈中,随后按照先进后出的顺序执行。

    func main() {
      defer fmt.Println("1")
      defer fmt.Println("2")
      defer fmt.Println("3")
      defer fmt.Println("4")
    }
    

    输出顺序为4321

    使用defer逆序输出字符串

    name := "Naveen你好"
      fmt.Printf("%s\n", string(name))
      fmt.Printf("逆序:")
      defer fmt.Printf("\n")
      for _, v := range []rune(name) {
        defer fmt.Printf("%c", v)
      }
    

    输出:

    Naveen你好

    逆序:好你neevaN

    三、defer 的实际应用

    func (r rect) area(wg *sync.WaitGroup) {
      if r.length  0 {
        fmt.Printf("rect %v's length should be greater than zero\n", r)
        wg.Done()
        return
      }
      if r.width  0 {
        fmt.Printf("rect %v's width should be greater than zero\n", r)
        wg.Done()
        return
      }
      area := r.length * r.width
      fmt.Printf("rect %v's area %d\n", r, area)
      wg.Done()
    }
    

    我们会发现上面wg.Done()被调用多次我们可以使用defer来优化代码

    func (r rect) area(wg *sync.WaitGroup) {
      defer wg.Done()
      if r.length  0 {
        fmt.Printf("rect %v's length should be greater than zero\n", r)
        return
      }
      if r.width  0 {
        fmt.Printf("rect %v's width should be greater than zero\n", r)
        return
      }
      area := r.length * r.width
      fmt.Printf("rect %v's area %d\n", r, area)
    }
    

    使用defer延时调用,会在程序结束之前调用

    下面举个例子:

    package main 
    import "fmt" 
    func deferTest(number int) int {
     defer func() {
     number++
     fmt.Println("three:", number)
     }()
     
     defer func() {
     number++
     fmt.Println("two:", number)
     }()
     
     defer func() {
     number++
     fmt.Println("one:", number)
     }()
     
     return number
    }
     
    func main() {
     fmt.Println("函数返回值:", deferTest(0))
    }
    
    

    上面的代码打印的结果是:

    one: 1
    two: 2
    three: 3
    函数返回值: 0

    PS:defer 有一个重要的特性,即便函数抛出了异常,defer也会被执行的。这样就不会因为程序出现了错误,导致资源不会被释放了。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Golang之defer 延迟调用操作
    • 聊聊golang的defer的使用
    • golang中defer的关键特性示例详解
    • golang中defer的使用规则详解
    • Golang巧用defer进行错误处理的方法
    • Golang 的defer执行规则说明
    上一篇:gorm golang 并发连接数据库报错的解决方法
    下一篇:golang解析域名的步骤全纪录
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang学习笔记之延迟函数(defer)的使用小结 Golang,学习,笔记,之,延迟,