91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-03 03:09:00 來源:腳本之家 閱讀:145 作者:學生黃哲 欄目:編程語言

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

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

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

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

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

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

我們會發現上面wg.Done()被調用多次我們可以使用defer來優化代碼

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("函數返回值:", deferTest(0))
}

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

one: 1
two: 2
three: 3
函數返回值: 0

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洮南市| 洞口县| 阿克苏市| 古丈县| 武城县| 菏泽市| 长岭县| 昌图县| 二手房| 松滋市| 辽阳市| 潮州市| 永昌县| 莒南县| 四川省| 静海县| 南京市| 肇庆市| 南漳县| 渭南市| 清河县| 本溪市| 池州市| 灵宝市| 泗阳县| 茂名市| 禹州市| 遂川县| 抚顺市| 庆阳市| 射洪县| 化州市| 抚远县| 西乌珠穆沁旗| 大方县| 遂平县| 浦城县| 万荣县| 山东| 嵊泗县| 年辖:市辖区|