在golang當(dāng)中,defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用。這個(gè)函數(shù)調(diào)用不是普通的函數(shù)調(diào)用,而是會(huì)在函數(shù)正常返回,也就是return之后添加一個(gè)函數(shù)調(diào)用。因此,defer通常用來(lái)釋放函數(shù)內(nèi)部變量。
我們提供的服務(wù)有:網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、中衛(wèi)ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的中衛(wèi)網(wǎng)站制作公司通過(guò)defer,我們可以在代碼中優(yōu)雅的關(guān)閉/清理代碼中所使用的變量。defer作為golang清理變量的特性,有其獨(dú)有且明確的行為。
package main func main() { test() }func test() { println("test1") defer func() { println("defer test2") }() println("test3") }
執(zhí)行結(jié)果如下:
test1 test3 defer test2
很清楚地看到,有defer那個(gè)函數(shù)最后才執(zhí)行的
現(xiàn)在改一下代碼,讓代碼panic,當(dāng)拋出異常時(shí),defer延遲函數(shù)還會(huì)執(zhí)行嗎?
package main func main() { test() }func test() { println("test1") panic("panic") defer func() { println("defer test2") }() println("test3") }
輸出
test1 panic: panic Process finished with exit code 2
延遲函數(shù)居然沒(méi)有執(zhí)行,為什么會(huì)這樣呢?是因?yàn)閜anic在延遲函數(shù)之前了,再改一下代碼如下
package main func main() { test() }func test() { println("test1") defer func() { println("defer test2") }() panic("panic") println("test3") }
輸出
test1 defer test2 panic: panic
延遲函數(shù)執(zhí)行了,可以看到panic在延遲函數(shù)之前延遲函數(shù)是執(zhí)行不了的,畢竟拋出異常。
以上就是golang defer什么時(shí)候執(zhí)行的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!