GO語言延遲函數(shù)defer用法分析
本文實(shí)例講述了GO語言延遲函數(shù)defer用法。分享給大家供大家參考。具體分析如下:
defer 在聲明時(shí)不會立即執(zhí)行,而是在函數(shù) return 后,再按照 FILO (先進(jìn)后出)的原則依次執(zhí)行每一個 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() //每次申請資源時(shí),請習(xí)慣立即申請一個 defer 關(guān)閉資源,這樣就不會忘記釋放資源了
dstFile, err := os.Create(dst)
if err != nil {
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
defer 還有一個重要的特性,就是即便函數(shù)拋出了異常,也會被執(zhí)行的。 這樣就不會因程序出現(xiàn)了錯誤,而導(dǎo)致資源不會釋放了。
希望本文所述對大家的GO語言程序設(shè)計(jì)有所幫助。
相關(guān)文章
Go語言基于viper實(shí)現(xiàn)apollo多實(shí)例快速
viper是適用于go應(yīng)用程序的配置解決方案,這款配置管理神器,支持多種類型、開箱即用、極易上手。本文主要介紹了如何基于viper實(shí)現(xiàn)apollo多實(shí)例快速接入,感興趣的可以了解一下2023-01-01golang?使用sort.slice包實(shí)現(xiàn)對象list排序
這篇文章主要介紹了golang?使用sort.slice包實(shí)現(xiàn)對象list排序,對比sort跟slice兩種排序的使用方式區(qū)別展開內(nèi)容,需要的小伙伴可以參考一下2022-03-03go?time.Sleep睡眠指定時(shí)間實(shí)例詳解(小時(shí)級到納秒級)
golang的休眠可以使用time包中的sleep,下面這篇文章主要給大家介紹了關(guān)于go?time.Sleep睡眠指定時(shí)間(小時(shí)級到納秒級)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能
這篇文章主要介紹了golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,文章通過golang導(dǎo)出excel文件返回給web,實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03Go語言range關(guān)鍵字循環(huán)時(shí)的坑
今天小編就為大家分享一篇關(guān)于Go語言range關(guān)鍵字循環(huán)時(shí)的坑,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03