golang中defer執(zhí)行時(shí)機(jī)的案例分析
示例代碼
package main
import "fmt"
func calcFunc(x int, y int) int {
return x + y
}
func main() {
// defer語(yǔ)句的執(zhí)行順序是,從右到左,逆序執(zhí)行
deferDemo()
// deferDemo1函數(shù)
demo1 := deferDemo1()
fmt.Println(demo1) // 0
// deferDemo2函數(shù)
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
// 難點(diǎn)解析
/*
分析:
defer注冊(cè)順序:
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
// 注冊(cè)的時(shí)候 x = 1, y = 2 所以執(zhí)行的時(shí)候x = 1, y = 2
defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 結(jié)果是:4
x = 10
// 注冊(cè)的時(shí)候x = 10, y = 2 所以執(zhí)行的時(shí)候x = 10, y = 2
defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結(jié)果是:22
y = 20
}分析:
defer語(yǔ)句的執(zhí)行順序是,從右到左,逆序執(zhí)行
執(zhí)行deferDemo()函數(shù)時(shí),會(huì)先執(zhí)行defer語(yǔ)句,再執(zhí)行函數(shù)體,函數(shù)體執(zhí)行完后,再執(zhí)行defer語(yǔ)句
執(zhí)行結(jié)果:
開啟defer
結(jié)束defer
defer語(yǔ)句6
defer語(yǔ)句5
defer語(yǔ)句4
defer語(yǔ)句3
defer語(yǔ)句2
defer語(yǔ)句1
demo:
func deferDemo() {
fmt.Println("開啟defer")
defer func() {
fmt.Println("defer語(yǔ)句1")
}()
defer func() {
fmt.Println("defer語(yǔ)句2")
}()
defer func() {
fmt.Println("defer語(yǔ)句3")
}()
defer fmt.Println("defer語(yǔ)句4")
defer fmt.Println("defer語(yǔ)句5")
defer fmt.Println("defer語(yǔ)句6")
fmt.Println("結(jié)束defer")
}
deferDemo1執(zhí)行結(jié)果是 0,延遲執(zhí)行
func deferDemo1() int {
var a int
defer func() {
a++
}()
return a
}
deferDemo2執(zhí)行結(jié)果是1:原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return
func deferDemo2() (a int) {
// 步驟一先賦值
//a = 0
// 步驟二再執(zhí)行defer語(yǔ)句
defer func() {
a++
}()
// 步驟三再執(zhí)行函數(shù)體
// 返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return
return a
}
deferDemo3執(zhí)行結(jié)果是1: 原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return
func deferDemo3() (a int) {
defer func() {
a++
}()
return a
}
deferDemo4
func deferDemo4() int {
x := 1
defer func(x int) {
x++ // 內(nèi)部x和外面x不是同一個(gè)變量
}(x)
return x // 1
}
deferDemo5
func deferDemo5() (x int) {
x = 1
defer func(x int) {
x++ // 內(nèi)部x和外面x不是同一個(gè)變量
}(x)
return x // 1
}
deferDemo6
func deferDemo6() (x int) {
x = 1
defer func() {
x++
}()
return x // 2
}
到此這篇關(guān)于golang中defer執(zhí)行時(shí)機(jī)的案例分析的文章就介紹到這了,更多相關(guān)go defer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)
這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語(yǔ)言小白的掃盲文,主要講解了go語(yǔ)言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下2022-12-12
Golang實(shí)現(xiàn)檢測(cè)SSL證書有效期
本文主要為大家詳細(xì)介紹如何使用Go語(yǔ)言中的crypto/tls模塊來(lái)獲取網(wǎng)站的SSL/TLS證書信息并檢查其有效期,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-04-04
Golang并發(fā)繞不開的重要組件之Channel詳解
Channel是一個(gè)提供可接收和發(fā)送特定類型值的用于并發(fā)函數(shù)通信的數(shù)據(jù)類型,也是Golang并發(fā)繞不開的重要組件之一,本文就來(lái)和大家深入聊聊Channel的相關(guān)知識(shí)吧2023-06-06
golang中for循環(huán)遍歷channel時(shí)需要注意的問題詳解
這篇文章主要給大家介紹了關(guān)于golang中for循環(huán)遍歷channel時(shí)需要注意的問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
golang調(diào)用c實(shí)現(xiàn)的dll接口細(xì)節(jié)分享
這篇文章主要介紹了golang調(diào)用c實(shí)現(xiàn)的dll接口細(xì)節(jié)分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-05-05

