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

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

 更新時(shí)間:2018年12月12日 09:59:21   作者:學(xué)生黃哲  
這篇文章主要介紹了Golang學(xué)習(xí)筆記之延遲函數(shù)(defer),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 重學(xué)Go語(yǔ)言之JSON操作詳解

    重學(xué)Go語(yǔ)言之JSON操作詳解

    JSON的全稱是Javascript?Object?Notation,是一種數(shù)據(jù)結(jié)構(gòu)化交互的標(biāo)準(zhǔn)協(xié)議,這篇文章主要是來(lái)和大家介紹一下Go語(yǔ)言中JSON的相關(guān)操作,需要的可以參考下
    2023-08-08
  • 一文帶你探索Golang計(jì)時(shí)器的奧秘

    一文帶你探索Golang計(jì)時(shí)器的奧秘

    在?Golang?中,計(jì)時(shí)器(timer)是一種常見(jiàn)的工具,用于定期執(zhí)行某個(gè)任務(wù)或者在指定時(shí)間后觸發(fā)某個(gè)事件。本文將深入探討?Golang?計(jì)時(shí)器的實(shí)現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用計(jì)時(shí)器
    2023-05-05
  • go中make用法及常見(jiàn)的一些坑

    go中make用法及常見(jiàn)的一些坑

    golang分配內(nèi)存主要有內(nèi)置函數(shù)new和make,下面這篇文章主要給大家介紹了關(guān)于go中make用法及常見(jiàn)的一些坑,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Go語(yǔ)言中的Struct結(jié)構(gòu)體

    Go語(yǔ)言中的Struct結(jié)構(gòu)體

    這篇文章介紹了Go語(yǔ)言中的Struct結(jié)構(gòu)體,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • GO語(yǔ)言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)

    GO語(yǔ)言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)

    這篇文章主要介紹了GO語(yǔ)言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)的相關(guān)資料,內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的朋友可任意參考一下
    2022-03-03
  • Go語(yǔ)言中Seeker接口的用法詳解

    Go語(yǔ)言中Seeker接口的用法詳解

    Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的io包提供了一系列接口,用于處理各種I/O操作,其中Seeker接口在處理大文件或需要隨機(jī)訪問(wèn)的場(chǎng)景中非常有用,本文將結(jié)合具體案例,詳細(xì)介紹Go語(yǔ)言中io包的Seeker接口的用法,需要的朋友可以參考下
    2024-10-10
  • Go實(shí)現(xiàn)圖片上添加水印的示例代碼

    Go實(shí)現(xiàn)圖片上添加水印的示例代碼

    本文主要介紹了Go實(shí)現(xiàn)圖片上添加水印的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • golang實(shí)現(xiàn)的文件上傳下載小工具

    golang實(shí)現(xiàn)的文件上傳下載小工具

    這篇文章主要介紹了golang實(shí)現(xiàn)的文件上傳下載小工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Go語(yǔ)言中函數(shù)的使用方法詳解

    Go語(yǔ)言中函數(shù)的使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中函數(shù)的使用方法的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的可以了解一下
    2023-04-04
  • golang實(shí)踐-第三方包為私有庫(kù)的配置方案

    golang實(shí)踐-第三方包為私有庫(kù)的配置方案

    這篇文章主要介紹了golang實(shí)踐-第三方包為私有庫(kù)的配置方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論