欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年12月12日 09:59:21   作者:學生黃哲  
這篇文章主要介紹了Golang學習筆記之延遲函數(defer),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

二、當一個函數內多次調用 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ā)現上面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("函數返回值:", deferTest(0))
}

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

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

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

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

相關文章

  • golang-gin-mgo高并發(fā)服務器搭建教程

    golang-gin-mgo高并發(fā)服務器搭建教程

    這篇文章主要介紹了golang-gin-mgo高并發(fā)服務器搭建教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang 檢查網絡狀態(tài)是否正常的方法

    golang 檢查網絡狀態(tài)是否正常的方法

    今天小編就為大家分享一篇golang 檢查網絡狀態(tài)是否正常的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 探索Golang實現Redis持久化AOF實例

    探索Golang實現Redis持久化AOF實例

    這篇文章主要為大家介紹了Golang實現Redis持久化AOF實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang 常用定時任務匯總

    golang 常用定時任務匯總

    這篇文章主要介紹了golang 常用定時任務匯總,golang利用goroutine外加github.com/gorhill/cronexpr庫就可實現定時任務,具體代碼介紹,需要的小伙伴可以參考一下
    2022-09-09
  • Go語言官方依賴注入工具Wire的使用教程

    Go語言官方依賴注入工具Wire的使用教程

    依賴注入是一種實現控制反轉且用于解決依賴性問題的設計模式。Golang?中常用的依賴注入工具主要有?Inject?、Dig?等。但是今天主要介紹的是?Go?團隊開發(fā)的?Wire,一個編譯期實現依賴注入的工具,感興趣的可以了解一下
    2022-09-09
  • Go 庫bytes.Buffer和strings.Builder使用及性能對比

    Go 庫bytes.Buffer和strings.Builder使用及性能對比

    這篇文章主要為大家介紹了Go 庫bytes.Buffer和strings.Builder使用及性能對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go語言擴展原語之ErrGroup的用法詳解

    Go語言擴展原語之ErrGroup的用法詳解

    除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了4種擴展原語,本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下
    2023-07-07
  • Golang中函數的使用方法詳解

    Golang中函數的使用方法詳解

    這篇文章主要詳細介紹了Golang中函數的使用方法,文中有詳細的示例代碼,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • GoLang中Module的基本使用方法

    GoLang中Module的基本使用方法

    Go module是從Go 1.11版本才引入的新功能,下面這篇文章主要給大家介紹了關于GoLang中Module的基本使用方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    這篇文章主要介紹了提升Go語言開發(fā)效率的小技巧匯總,也就是Go語言的語法糖,掌握好這些可以提高我們的開發(fā)效率,需要的朋友可以參考下
    2022-11-11

最新評論