golang中defer執(zhí)行時機的案例分析
示例代碼
package main
import "fmt"
func calcFunc(x int, y int) int {
return x + y
}
func main() {
// defer語句的執(zhí)行順序是,從右到左,逆序執(zhí)行
deferDemo()
// deferDemo1函數
demo1 := deferDemo1()
fmt.Println(demo1) // 0
// deferDemo2函數
demo2 := deferDemo2()
fmt.Println(demo2) // 1
// deferDemo4
demo4 := deferDemo4()
fmt.Println(demo4) // 1
// deferDemo5
demo5 := deferDemo5()
fmt.Println(demo5) // 1
// deferDemo6
demo6 := deferDemo6()
fmt.Println(demo6) // 2
// 難點解析
/*
分析:
defer注冊順序:
1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y)))
2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
defer執(zhí)行順序:
1. fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
2. fmt.Println("AA", calcFunc(x, calcFunc(x, y)))
*/
x := 1
y := 2
// 注冊的時候 x = 1, y = 2 所以執(zhí)行的時候x = 1, y = 2
defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 結果是:4
x = 10
// 注冊的時候x = 10, y = 2 所以執(zhí)行的時候x = 10, y = 2
defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結果是:22
y = 20
}分析:
defer語句的執(zhí)行順序是,從右到左,逆序執(zhí)行
執(zhí)行deferDemo()函數時,會先執(zhí)行defer語句,再執(zhí)行函數體,函數體執(zhí)行完后,再執(zhí)行defer語句
執(zhí)行結果:
開啟defer
結束defer
defer語句6
defer語句5
defer語句4
defer語句3
defer語句2
defer語句1
demo:
func deferDemo() {
fmt.Println("開啟defer")
defer func() {
fmt.Println("defer語句1")
}()
defer func() {
fmt.Println("defer語句2")
}()
defer func() {
fmt.Println("defer語句3")
}()
defer fmt.Println("defer語句4")
defer fmt.Println("defer語句5")
defer fmt.Println("defer語句6")
fmt.Println("結束defer")
}
deferDemo1執(zhí)行結果是 0,延遲執(zhí)行
func deferDemo1() int {
var a int
defer func() {
a++
}()
return a
}
deferDemo2執(zhí)行結果是1:原因返回匿名返回值a等待函數體內操作完成才會執(zhí)行return
func deferDemo2() (a int) {
// 步驟一先賦值
//a = 0
// 步驟二再執(zhí)行defer語句
defer func() {
a++
}()
// 步驟三再執(zhí)行函數體
// 返回值a等待函數體內操作完成才會執(zhí)行return
return a
}
deferDemo3執(zhí)行結果是1: 原因返回匿名返回值a等待函數體內操作完成才會執(zhí)行return
func deferDemo3() (a int) {
defer func() {
a++
}()
return a
}
deferDemo4
func deferDemo4() int {
x := 1
defer func(x int) {
x++ // 內部x和外面x不是同一個變量
}(x)
return x // 1
}
deferDemo5
func deferDemo5() (x int) {
x = 1
defer func(x int) {
x++ // 內部x和外面x不是同一個變量
}(x)
return x // 1
}
deferDemo6
func deferDemo6() (x int) {
x = 1
defer func() {
x++
}()
return x // 2
}
到此這篇關于golang中defer執(zhí)行時機的案例分析的文章就介紹到這了,更多相關go defer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang并發(fā)繞不開的重要組件之Channel詳解
Channel是一個提供可接收和發(fā)送特定類型值的用于并發(fā)函數通信的數據類型,也是Golang并發(fā)繞不開的重要組件之一,本文就來和大家深入聊聊Channel的相關知識吧2023-06-06
golang中for循環(huán)遍歷channel時需要注意的問題詳解
這篇文章主要給大家介紹了關于golang中for循環(huán)遍歷channel時需要注意的問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04

