• Go——延迟函数 defer 用法举例 (转)


    转自: https://www.cnblogs.com/zhangmingcheng/p/15205970.html

    例一、defer_a.go

    package main
    import "fmt"
    func main() {
        fmt.Println("a return:", a()) // 打印结果为 a return: 0
    }
     
    func a() int {
        var i int
        defer func() {
            i++
            fmt.Println("a defer2:", i) // 打印结果为 a defer2: 2
        }()
        defer func() {
            i++
            fmt.Println("a defer1:", i) // 打印结果为 a defer1: 1
        }()
        return i
    }
    
    // go run  defer_a.go
    // a defer1: 1
    // a defer2: 2
    // a return: 0

    例二、defer_b.go

    package main
    import "fmt"
    func main() {
        fmt.Println("b return:", b()) // 打印结果为 b return: 2
    }
    func b() (i int) {
        defer func() {
            i++
            fmt.Println("b defer2:", i) // 打印结果为 b defer2: 2
        }()
        defer func() {
            i++
            fmt.Println("b defer1:", i) // 打印结果为 b defer1: 1
        }()
        return i // 或者直接 return 效果相同
    }
    
    // go run  defer_b.go
    // b defer1: 1
    // b defer2: 2
    // b return: 2

    例三、defer_c.go

    package main
    import "fmt"
    func main() {
        c:=c()
        fmt.Println("c return:", *c, c) // 打印结果为 c return: 2 0xc082008340
    }
    func c() *int {
        var i int
        defer func() {
            i++
            fmt.Println("c defer2:", i, &i) // 打印结果为 c defer2: 2 0xc082008340
        }()
        defer func() {
            i++
            fmt.Println("c defer1:", i, &i) // 打印结果为 c defer1: 1 0xc082008340
        }()
        return &i
    }
    
    // go run  defer_c.go
    // c defer1: 1 0xc0000b2008
    // c defer2: 2 0xc0000b2008
    // c return: 2 0xc0000b2008

    例四、defer_d.go

    package main
    import (
        "fmt"
        "time"
    )
    func main() {
        defer P(time.Now())
        time.Sleep(5e9)   //5 seconds
        fmt.Println("main ", time.Now())
    }
     
    func P(t time.Time) {
        fmt.Println("defer", t)
        fmt.Println("P    ", time.Now())
    }
    
    // go run  defer_d.go
    // main  2022-01-26 17:10:00.461692 +0800 CST m=+5.000733360
    // defer 2022-01-26 17:09:55.460852 +0800 CST m=+0.000079331
    // P     2022-01-26 17:10:00.462076 +0800 CST m=+5.001117721

    例五、defer_e.go

    package main
    import (
        "errors"
        "fmt"
        "time"
        // "os"
    )
    func main() {
        e := errors.New("error")
        fmt.Println(e)
        // (3)panic(e) // defer 不会执行
        // (4)os.Exit(1) // defer 不会执行
        defer fmt.Println("defer")
        // (1)go func() { panic(e) }() // 会导致 defer 不会执行
        // (2)panic(e) // defer 会执行
        time.Sleep(1e9)
        fmt.Println("over.")
        // (5)os.Exit(1) // defer 不会执行
    }
    // go run  defer_e.go
    // error
    // over.
    // defer

    例六、defer_f.go

    package main
    import "fmt"
    func main() {
        defer fmt.Println()
        defer fmt.Print(1)
        defer fmt.Print(2)
        defer fmt.Print(3)
        defer fmt.Print(4)
    }
    // go run  defer_f.go
    // 4321
  • 相关阅读:
    Nginx 允许多个域名跨域访问
    mongo 命令
    PyTorch torch.cuda.device_count 返回值与实际 GPU 数量不一致
    APUE 学习笔记 —— 文件I/O
    Django transaction 误用之后遇到的一个问题与解决方法
    如何更新 CentOS 镜像源
    Supervisor 的安装与配置教程
    Sentry的安装搭建与使用
    Python, Django 性能分析工具的使用
    记一次 Apache HUE 优化之因使用 Python 魔术方法而遇到的坑
  • 原文地址:https://www.cnblogs.com/xingchong/p/15847398.html
Copyright © 2020-2023  润新知