GO語言延遲函數(shù)defer用法分析
本文實(shí)例講述了GO語言延遲函數(shù)defer用法。分享給大家供大家參考。具體分析如下:
defer 在聲明時(shí)不會(huì)立即執(zhí)行,而是在函數(shù) return 后,再按照 FILO (先進(jìn)后出)的原則依次執(zhí)行每一個(gè) defer,一般用于異常處理、釋放資源、清理數(shù)據(jù)、記錄日志等。這有點(diǎn)像面向?qū)ο笳Z言的析構(gòu)函數(shù),優(yōu)雅又簡潔,是 Golang 的亮點(diǎn)之一。
代碼1:了解 defer 的執(zhí)行順序
import "fmt"
func fn(n int) int {
defer func() {
n++
fmt.Println("3st:", n)
}()
defer func() {
n++
fmt.Println("2st:", n)
}()
defer func() {
n++
fmt.Println("1st:", n)
}()
return n //沒有做任何事情
}
func main() {
fmt.Println("函數(shù)返回值:", fn(0))
}
輸出:
1st: 1
2st: 2
3st: 3
函數(shù)返回值: 0
代碼2:經(jīng)典應(yīng)用實(shí)例
srcFile, err := os.Open(src)
if err != nil {
return
}
defer srcFile.Close() //每次申請(qǐng)資源時(shí),請(qǐng)習(xí)慣立即申請(qǐng)一個(gè) defer 關(guān)閉資源,這樣就不會(huì)忘記釋放資源了
dstFile, err := os.Create(dst)
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
defer 還有一個(gè)重要的特性,就是即便函數(shù)拋出了異常,也會(huì)被執(zhí)行的。 這樣就不會(huì)因程序出現(xiàn)了錯(cuò)誤,而導(dǎo)致資源不會(huì)釋放了。
希望本文所述對(duì)大家的GO語言程序設(shè)計(jì)有所幫助。
相關(guān)文章
GoLang協(xié)程庫libtask學(xué)習(xí)筆記
libtask一個(gè)C語言的協(xié)程庫,是go語言的前身很早期的原型. 測(cè)試機(jī)器是我的mac air 安裝的centos虛擬機(jī)(只有一個(gè)核), 代碼沒有采用任何優(yōu)化,只是使用默認(rèn)配置2022-12-12
Go處理JSON數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了Go處理JSON數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
golang 如何通過反射創(chuàng)建新對(duì)象
這篇文章主要介紹了golang 通過反射創(chuàng)建新對(duì)象的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
使用Go基于WebSocket構(gòu)建千萬級(jí)視頻直播彈幕系統(tǒng)的代碼詳解
這篇文章主要介紹了使用Go基于WebSocket構(gòu)建千萬級(jí)視頻直播彈幕系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

