首页 > 其他 > 详细

golang的defer

时间:2021-04-16 17:58:13      阅读:29      评论:0      收藏:0      [点我收藏+]

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

 

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())

}

 

 

 

 

 

 

 

 

 

 

 

 

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

golang的defer

原文:https://www.cnblogs.com/igoodful/p/14666803.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!