濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)

Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)

熱門(mén)標(biāo)簽:江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 高德地圖標(biāo)注口訣 地圖標(biāo)注的汽車(chē)標(biāo) 學(xué)海導(dǎo)航地圖標(biāo)注 浙江高速公路地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 中國(guó)地圖標(biāo)注省會(huì)高清 南通如皋申請(qǐng)開(kāi)通400電話 西部云谷一期地圖標(biāo)注

golang的defer優(yōu)雅又簡(jiǎn)潔, 是golang的亮點(diǎn)之一。defer在聲明時(shí)不會(huì)立即執(zhí)行,而是在函數(shù)return后,再按照先進(jìn)后出的原則依次執(zhí)行每個(gè)defer,一般用于釋放資源、清理數(shù)據(jù)、記錄日志、異常處理等。

關(guān)鍵字defer于注冊(cè)延遲調(diào)用。這些調(diào)用直到 ret 前才被執(zhí)行,通常用于釋放資源或錯(cuò)誤處理。

一、當(dāng)defer被聲明時(shí),其參數(shù)就會(huì)被實(shí)時(shí)解析

func a() {
  i := 0
  defer fmt.Println(i) //輸出0,因?yàn)閕此時(shí)就是0
  i++
  defer fmt.Println(i) //輸出1,因?yàn)閕此時(shí)就是1
  return
}

二、當(dāng)一個(gè)函數(shù)內(nèi)多次調(diào)用 defer 時(shí),Go 會(huì)把 defer 調(diào)用放入到一個(gè)棧中,隨后按照先進(jìn)后出的順序執(zhí)行。

func main() {
  defer fmt.Println("1")
  defer fmt.Println("2")
  defer fmt.Println("3")
  defer fmt.Println("4")
}

輸出順序?yàn)?321

使用defer逆序輸出字符串

name := "Naveen你好"
  fmt.Printf("%s\n", string(name))
  fmt.Printf("逆序:")
  defer fmt.Printf("\n")
  for _, v := range []rune(name) {
    defer fmt.Printf("%c", v)
  }

輸出:

Naveen你好

逆序:好你neevaN

三、defer 的實(shí)際應(yīng)用

func (r rect) area(wg *sync.WaitGroup) {
  if r.length  0 {
    fmt.Printf("rect %v's length should be greater than zero\n", r)
    wg.Done()
    return
  }
  if r.width  0 {
    fmt.Printf("rect %v's width should be greater than zero\n", r)
    wg.Done()
    return
  }
  area := r.length * r.width
  fmt.Printf("rect %v's area %d\n", r, area)
  wg.Done()
}

我們會(huì)發(fā)現(xiàn)上面wg.Done()被調(diào)用多次我們可以使用defer來(lái)優(yōu)化代碼

func (r rect) area(wg *sync.WaitGroup) {
  defer wg.Done()
  if r.length  0 {
    fmt.Printf("rect %v's length should be greater than zero\n", r)
    return
  }
  if r.width  0 {
    fmt.Printf("rect %v's width should be greater than zero\n", r)
    return
  }
  area := r.length * r.width
  fmt.Printf("rect %v's area %d\n", r, area)
}

使用defer延時(shí)調(diào)用,會(huì)在程序結(jié)束之前調(diào)用

下面舉個(gè)例子:

package main 
import "fmt" 
func deferTest(number int) int {
 defer func() {
 number++
 fmt.Println("three:", number)
 }()
 
 defer func() {
 number++
 fmt.Println("two:", number)
 }()
 
 defer func() {
 number++
 fmt.Println("one:", number)
 }()
 
 return number
}
 
func main() {
 fmt.Println("函數(shù)返回值:", deferTest(0))
}

上面的代碼打印的結(jié)果是:

one: 1
two: 2
three: 3
函數(shù)返回值: 0

PS:defer 有一個(gè)重要的特性,即便函數(shù)拋出了異常,defer也會(huì)被執(zhí)行的。這樣就不會(huì)因?yàn)槌绦虺霈F(xiàn)了錯(cuò)誤,導(dǎo)致資源不會(huì)被釋放了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Golang之defer 延遲調(diào)用操作
  • 聊聊golang的defer的使用
  • golang中defer的關(guān)鍵特性示例詳解
  • golang中defer的使用規(guī)則詳解
  • Golang巧用defer進(jìn)行錯(cuò)誤處理的方法
  • Golang 的defer執(zhí)行規(guī)則說(shuō)明

標(biāo)簽:東營(yíng) 許昌 德宏 曲靖 吐魯番 保定 常州 貴州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)》,本文關(guān)鍵詞  Golang,學(xué)習(xí),筆記,之,延遲,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    溧阳市| 读书| 河池市| 曲松县| 蓬安县| 洪湖市| 颍上县| 轮台县| 新密市| 馆陶县| 大余县| 和平区| 玉溪市| 明水县| 米脂县| 灵璧县| 双桥区| 海安县| 新兴县| 仁寿县| 清镇市| 吉隆县| 雅江县| 望城县| 新泰市| 资溪县| 定州市| 惠水县| 镇平县| 屏南县| 多伦县| 琼中| 安徽省| 迁安市| 远安县| 临泉县| 雅安市| 西充县| 兴城市| 绥滨县| 溧阳市|