• golang之匿名函数结合defer


    defer语句中的函数会在return语句更新返回值变量后再执行,又因为在函数中定义的匿名函数可以访问该函数包括返回值变量在内的所有变量,所以,对匿名函数采用defer机制,可以使其观察函数的返回值。

    以double函数为例:

    func double(x int) int {
      return x + x
    }

    我们只需要首先命名double的返回值,再增加defer语句,我们就可以在double每次被调用时,输出参数以及返回值。

    func double(x int) (result int) {
      defer func() { fmt.Printf("double(%d) = %d
    ", x,result) }()
      return x + x
    }
    _ = double(4)
    // Output:
    // "double(4) = 8"

    可能doulbe函数过于简单,看不出这个小技巧的作用,但对于有许多return语句的函数而言,这个技巧很有用。

    被延迟执行的匿名函数甚至可以修改函数返回给调用者的返回值:

    func triple(x int) (result int) {
      defer func() { result += x }()
      return double(x)
    }
    fmt.Println(triple(4)) // "12"

    在循环体中的defer语句需要特别注意,因为只有在函数执行完毕后,这些被延迟的函数才会执行。下面的代码会导致系统的文件描述符耗尽,因为在所有文件都被处理之前,没有文件会被关闭。

    for _, filename := range filenames {
        f, err := os.Open(filename)
        if err != nil {
            return err
        }
        defer f.Close() // NOTE: risky; could run out of file
        descriptors
        // ...process f…
    }    
    人生就是要不断折腾
  • 相关阅读:
    DockerFile体系结构
    Nignx(二) server_name 规则
    解决Redis分布式锁——死锁问题
    redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    Docker_Linux
    正则例子
    部属流程
    Mysql insert语句的优化
    MySQL innodb_fast_shutdown参数讲解
    MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/11992712.html
Copyright © 2020-2023  润新知