defer執行

package main

import "fmt"

func deferDemo(){
	fmt.Println("start")
	defer fmt.Println("嘿嘿嘿")		// defer把它後面的語句延遲到函數即將返回的時候再執行
	defer fmt.Println("呵呵呵")		// 多個defer按後進先出的順序延遲執行,多用於函數結束前資源釋放
	defer fmt.Println("哈哈哈")		//
	fmt.Println("end")
}
// Go語言中函數的return不是原子操作,在底層分爲兩步執行
// 第一步:返回值賦值
// defer
// 第二步:真正的RET返回
// 函數中如果存在defer,那麼defer執行的時機是在第一步和第二步之間
func f1() int{
	x := 5
	defer func(){
		x++
	}()
	return x	// 先做x=5,然後執行到return,return x就是return 5了,返回值是5,後面x變化不影響返回值了
}
func f2()(x int){
	defer func(){
		x++
	}()
	return 5	// 直接聲明返回x,最後return 5,是把5賦值給x,然後x++
}
func f3()(y int){
	x := 5
	defer func(){
		x++	// 修改的是x
	}()
	return x	// 返回值 = y = x = 5
}
func f4()(x int){
	defer func(x int){
		x++
	}(x)
	return 5
}
func main() {
	deferDemo()
	fmt.Println(f1())	// 5
	fmt.Println(f2())	// 6
	fmt.Println(f3())	// 5
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章