婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang學習筆記之延遲函數(shù)(defer)的使用小結

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

熱門標簽:江西轉化率高的羿智云外呼系統(tǒng) 高德地圖標注口訣 地圖標注的汽車標 學海導航地圖標注 浙江高速公路地圖標注 廣州呼叫中心外呼系統(tǒng) 中國地圖標注省會高清 南通如皋申請開通400電話 西部云谷一期地圖標注

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

關鍵字defer于注冊延遲調用。這些調用直到 ret 前才被執(zhí)行,通常用于釋放資源或錯誤處理。

一、當defer被聲明時,其參數(shù)就會被實時解析

func a() {
  i := 0
  defer fmt.Println(i) //輸出0,因為i此時就是0
  i++
  defer fmt.Println(i) //輸出1,因為i此時就是1
  return
}

二、當一個函數(shù)內多次調用 defer 時,Go 會把 defer 調用放入到一個棧中,隨后按照先進后出的順序執(zhí)行。

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

輸出順序為4321

使用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 的實際應用

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()
}

我們會發(fā)現(xiàn)上面wg.Done()被調用多次我們可以使用defer來優(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延時調用,會在程序結束之前調用

下面舉個例子:

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))
}

上面的代碼打印的結果是:

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

PS:defer 有一個重要的特性,即便函數(shù)拋出了異常,defer也會被執(zhí)行的。這樣就不會因為程序出現(xiàn)了錯誤,導致資源不會被釋放了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

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

標簽:東營 許昌 德宏 曲靖 吐魯番 保定 常州 貴州

巨人網絡通訊聲明:本文標題《Golang學習筆記之延遲函數(shù)(defer)的使用小結》,本文關鍵詞  Golang,學習,筆記,之,延遲,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang學習筆記之延遲函數(shù)(defer)的使用小結》相關的同類信息!
  • 本頁收集關于Golang學習筆記之延遲函數(shù)(defer)的使用小結的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 潼南县| 玉田县| 松潘县| 蕲春县| 彝良县| 阳原县| 武山县| 辽宁省| 前郭尔| 林州市| 建湖县| 克什克腾旗| 雅安市| 厦门市| 新野县| 志丹县| 乌兰察布市| 临沂市| 左权县| 玉树县| 忻州市| 彭水| 汾阳市| 江华| 温宿县| 冕宁县| 凌海市| 剑河县| 贺州市| 塘沽区| 卢龙县| 蒲江县| 华亭县| 广丰县| 华亭县| 大庆市| 明光市| 尚志市| 邵阳市| 大洼县| 丹阳市|