国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

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

2020-04-01 18:50:47
字體:
來源:轉載
供稿:網(wǎng)友

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)了錯誤,導致資源不會被釋放了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 聊城市| 安康市| 淅川县| 望奎县| 洪江市| 逊克县| 河北区| 长沙市| 晋州市| 桦川县| 白银市| 屏东市| 伊金霍洛旗| 鹤山市| 祥云县| 闻喜县| 沭阳县| 凉城县| 西畴县| 鹰潭市| 彩票| 孝感市| 阿拉善右旗| 秀山| 永吉县| 定陶县| 镇原县| 旺苍县| 吉木乃县| 根河市| 建瓯市| 闻喜县| 平昌县| 同仁县| 炎陵县| 隆化县| 江山市| 天全县| 合水县| 威远县| 南乐县|