Go语言defer函数运行流程

defer函数会将后面的函数依次入栈,入栈的同时将函数中所需的变量值值也拷贝到栈里面了,因此后面改变函数变量的值,defer执行的时候,变量值仍是入栈时的值,并未改变。举例如下:

package main

import (
    "fmt"
)
//可变参数放在形参列表中最后
//init函数在Main之前执行

func test() int{
    fmt.Println("funck")
    return 90
}
var age =test()

func swap( a *int, b *int)   {
    t := *a
    *a=*b
    *b =t
    fmt.Println("a=",*a,"b=",*b)

}

func main(){
    a :=10
    b :=20
    defer fmt.Println("a=", a)//入栈时同时将值也拷贝到栈里面了
    defer fmt.Println("b=", b)//在defer后可以继续使用,系统自动关闭资源
    swap(&a,&b)
   fmt.Println(a,b)
}

由于defer函数将两个println函数入栈时,拷贝了当前变量a,b的数值。两个Print函数在最后依次执行(依次出栈),输出的数值为一开始定义的a和b,后来经过交换值函数swag并不影响。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容