最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

關(guān)鍵字defer于注冊延遲調(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來優(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ì)被釋放了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 聊聊go xorm生成mysql的結(jié)構(gòu)體問題

    聊聊go xorm生成mysql的結(jié)構(gòu)體問題

    這篇文章主要介紹了go xorm生成mysql的結(jié)構(gòu)體問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-03-03
  • Go語言實(shí)現(xiàn)圖片快遞信息識(shí)別的簡易方法

    Go語言實(shí)現(xiàn)圖片快遞信息識(shí)別的簡易方法

    這篇文章主要為大家介紹了Go語言實(shí)現(xiàn)圖片快遞信息識(shí)別的簡易方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語言中接口組合的實(shí)現(xiàn)方法

    Go語言中接口組合的實(shí)現(xiàn)方法

    這篇文章主要介紹了Go語言中接口組合的實(shí)現(xiàn)方法,實(shí)例分析了接口中包含接口的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-02-02
  • Go經(jīng)典面試題匯總(填空+判斷)

    Go經(jīng)典面試題匯總(填空+判斷)

    這篇文章主要介紹了Go經(jīng)典面試題匯總(填空+判斷),本文章內(nèi)容詳細(xì),具有很好的參考價(jià)值,希望對大家有所幫助,需要的朋友可以參考下
    2023-01-01
  • golang使用go test輸出單元測試覆蓋率的方式

    golang使用go test輸出單元測試覆蓋率的方式

    單元測試覆蓋率是衡量代碼質(zhì)量的一個(gè)重要指標(biāo),重要的代碼文件覆蓋率應(yīng)該至少達(dá)到80%以上,Java 可以通過JaCoCo 統(tǒng)計(jì)覆蓋率,那么go 項(xiàng)目如何進(jìn)行代碼覆蓋率測試呢,本文將給大家詳細(xì)的介紹一下golang使用go test輸出單元測試覆蓋率的方式,需要的朋友可以參考下
    2024-02-02
  • go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子

    go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子

    今天小編就為大家分享一篇go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    如果一個(gè)類的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來,不管是直接構(gòu)造還是用建造者模式,都要對太多屬性進(jìn)行復(fù)制,那么有沒有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來解決這個(gè)問題
    2023-01-01
  • Go java 算法之括號(hào)生成示例詳解

    Go java 算法之括號(hào)生成示例詳解

    這篇文章主要為大家介紹了Go java 算法之括號(hào)生成示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go語言中值類型和指針類型的深入理解

    go語言中值類型和指針類型的深入理解

    這篇文章主要給大家介紹了關(guān)于go語言中值類型和指針類型的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • golang內(nèi)存逃逸的學(xué)習(xí)筆記

    golang內(nèi)存逃逸的學(xué)習(xí)筆記

    內(nèi)存逃逸是 Go 語言編程中一個(gè)特別需要注意的問題,會(huì)影響到程序的性能和穩(wěn)定性,本文主要介紹了golang內(nèi)存逃逸的學(xué)習(xí)筆記,感興趣的可以了解一下
    2024-05-05

最新評(píng)論

宁城县| 海淀区| 淮安市| 株洲县| 台江县| 尉氏县| 罗山县| 禹城市| 荥阳市| 福建省| 揭西县| 双桥区| 饶平县| 东阳市| 孝义市| 定边县| 龙川县| 泰州市| 游戏| 板桥市| 海安县| 无极县| 岗巴县| 桓台县| 和平县| 万荣县| 都匀市| 辉南县| 鄯善县| 长寿区| 普陀区| 贵阳市| 徐州市| 清远市| 中超| 苍梧县| 禹州市| 台中市| 安阳市| 温泉县| 井冈山市|