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并不影響。