defer 在聲明時(shí)不會(huì)立即執(zhí)行,而是在函數(shù) return 后,再按照 FILO (先進(jìn)后出)的原則依次執(zhí)行每一個(gè) defer,一般用于異常處理、釋放資源、清理數(shù)據(jù)、記錄日志等。這有點(diǎn)像面向?qū)ο笳Z言的析構(gòu)函數(shù),優(yōu)雅又簡(jiǎn)潔,是 Golang 的亮點(diǎn)之一。
package main
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))
}
func CopyFile(dst, src string) (w int64, err error) {
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)
}