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
}