zoukankan      html  css  js  c++  java
  • golang的defer

    #############################

    package main
    
    import (
        "fmt"
        "time"
    )
    
    // 规则一 当defer被声明时,其参数就会被实时解析
    // 规则二 多个defer执行顺序:defer执行顺序为先进后出
    // 规则三 defer可以读取有名返回值
    // 规则四 执行时机:函数return之后,函数返回给调用方之前之前
    func DeferTimeX() {
        startAt := time.Now()
        defer fmt.Println(time.Since(startAt))
        time.Sleep(10 * time.Second)
    }
    
    func DeferTimeY() {
        startAt := time.Now()
        defer func() {
            fmt.Println(time.Since(startAt))
        }()
        time.Sleep(3 * time.Second)
    }
    
    func DeferOrder() {
        defer fmt.Println("defer runs")
        fmt.Println("block ends")
        for i := 0; i < 10; i++ {
            defer fmt.Println(i)
        }
        fmt.Println("main ends")
    }
    
    func DeferPara() {
        i := 2
        defer fmt.Println("************* ", i) //输出2,因为i此时就是2
        i = i * 2
        defer fmt.Println("$$$$$$$$$$$$$ ", i) //输出4,因为i此时就是4
        i = i * 2
        fmt.Println("=================== ", i) //输出8
    
    }
    
    // 没有修改返回值
    func DeferFuncX() int {
        var i int
        fmt.Println("DeferFuncX ..........")
        fmt.Println("init at :", i)
        defer func() {
            fmt.Println("starting at :", i) //i此时就是16
            i++
            fmt.Println("end at :", i) //输出17
        }()
        return 16
    }
    
    // 修改了返回值
    func DeferFuncY() (i int) {
        fmt.Println("DeferFuncY ..........")
        fmt.Println("init at :", i)
        defer func() {
            fmt.Println("starting at :", i) //i此时就是16
            i++
            fmt.Println("end at :", i) //输出17
        }()
        return 16
    }
    
    func main() {
        DeferTimeX()
        DeferTimeY()
        DeferOrder()
        DeferPara()
        fmt.Println(DeferFuncX())
        fmt.Println(DeferFuncY())
    
    }

    ##########################

    igoodful@qq.com
  • 相关阅读:
    CISCO DHCP全攻略详解
    CentOS配置远程日志服务器
    CentOS下的日志切割
    CentOS日志的简单介绍
    H3C Telnet 配置
    CentOS7图形界面与命令行界面切换
    思科4506E做ehterchannel故障排查
    EtherChannel Cisco 端口聚合详解
    算法练习2之单链表求和
    Retrofit2的GsonConverterFactory.create()和RxJava2CallAdapterFactory.create()的实现过程以及执行过程
  • 原文地址:https://www.cnblogs.com/igoodful/p/14666803.html
Copyright © 2011-2022 走看看