Go語言defer函數(shù)運行流程

defer函數(shù)會將后面的函數(shù)依次入棧,入棧的同時將函數(shù)中所需的變量值值也拷貝到棧里面了,因此后面改變函數(shù)變量的值,defer執(zhí)行的時候,變量值仍是入棧時的值,并未改變。舉例如下:

package main

import (
    "fmt"
)
//可變參數(shù)放在形參列表中最后
//init函數(shù)在Main之前執(zhí)行

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后可以繼續(xù)使用,系統(tǒng)自動關(guān)閉資源
    swap(&a,&b)
   fmt.Println(a,b)
}

由于defer函數(shù)將兩個println函數(shù)入棧時,拷貝了當(dāng)前變量a,b的數(shù)值。兩個Print函數(shù)在最后依次執(zhí)行(依次出棧),輸出的數(shù)值為一開始定義的a和b,后來經(jīng)過交換值函數(shù)swag并不影響。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容