zoukankan      html  css  js  c++  java
  • 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…
    }    
    人生就是要不断折腾
  • 相关阅读:
    fatal error: bits/c++config.h: No such file or directory
    linux 下Beyond Compare 安装
    TD 加载界面实现
    JPA 如何实现 insert ignore
    jsonp 未实现跨域的原因?
    Linux 常用命令
    rancher server偶发504问题排查
    docker清理none image
    docker构建权限问题
    docker containers logs clean
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/11992712.html
Copyright © 2011-2022 走看看