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

淺談go中defer的一個(gè)隱藏功能

 更新時(shí)間:2019年12月10日 14:37:44   作者:KevinYan  
這篇文章主要介紹了淺談go中defer的一個(gè)隱藏功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在開始使用Go進(jìn)行編碼時(shí),Defer是要關(guān)注的一個(gè)很重要的特性。它非常簡(jiǎn)單:在任何函數(shù)中,給其他函數(shù)的調(diào)用加上前綴 defer以確保該函數(shù)在外部函數(shù)退出之前立即執(zhí)行,即使外部函數(shù)出現(xiàn)異常被中斷,該延遲函數(shù)也將運(yùn)行。

但是,你還可以使用defer在任何函數(shù)開始后和結(jié)束前執(zhí)行配對(duì)的代碼。這個(gè)隱藏的功能在網(wǎng)上的教程和書籍中很少提到。要使用此功能,需要?jiǎng)?chuàng)建一個(gè)函數(shù)并使它本身返回另一個(gè)函數(shù),返回的函數(shù)將作為真正的延遲函數(shù)。在 defer 語(yǔ)句調(diào)用父函數(shù)后在其上添加額外的括號(hào)來(lái)延遲執(zhí)行返回的子函數(shù)如下所示:

func main() {
  defer greet()() 
  fmt.Println("Some code here...")
}

func greet() func() {
  fmt.Println("Hello!")
  return func() { fmt.Println("Bye!") } // this will be deferred
}

輸出以下內(nèi)容:

Hello!
Some code here...
Bye!

父函數(shù)返回的函數(shù)將是實(shí)際的延遲函數(shù)。父函數(shù)中的其他代碼將在函數(shù)開始時(shí)(由 defer 語(yǔ)句放置的位置決定)立即執(zhí)行。

這為開發(fā)者提供了什么能力?因?yàn)樵诤瘮?shù)內(nèi)定義的匿名函數(shù)可以訪問(wèn)完整的詞法環(huán)境(lexical environment),這意味著在函數(shù)中定義的內(nèi)部函數(shù)可以引用該函數(shù)的變量。在下一個(gè)示例中看到的,參數(shù)變量在measure函數(shù)第一次執(zhí)行和其延遲執(zhí)行的子函數(shù)內(nèi)都能訪問(wèn)到:

func main() {
  example()
  otherExample()
}

func example(){
  defer measure("example")()
  fmt.Println("Some code here")
}

func otherExample(){
  defer measure("otherExample")()
  fmt.Println("Some other code here")
}

func measure(name string) func() {
  start := time.Now()
  fmt.Printf("Starting function %s\n", name)
  return func(){ fmt.Printf("Exiting function %s after %s\n", name, time.Since(start)) }
}

輸出以下內(nèi)容:

Starting example
Some code here
Exiting example after 0s
Starting otherExample
Some other code here
Exiting otherExample after 0s

此外函數(shù)命名的返回值也是函數(shù)內(nèi)的局部變量,所以上面例子中的measure函數(shù)如果接收命名返回值作為參數(shù)的話,那么命名返回值在延遲執(zhí)行的函數(shù)中訪問(wèn)到,這樣就能將measure函數(shù)改造成記錄入?yún)⒑头祷刂档墓ぞ吆瘮?shù)。

下面的示例是引用《go 語(yǔ)言程序設(shè)計(jì)》中的代碼段:

func bigSlowOperation() {
  defer trace("bigSlowOperation")() // don't forget the extra parentheses
  // ...lots of work…
  time.Sleep(10 * time.Second) // simulate slow
  operation by sleeping
}
func trace(msg string) func() {
  start := time.Now()
  log.Printf("enter %s", msg)
  return func() { 
    log.Printf("exit %s (%s)", msg,time.Since(start)) 
  }
}

可以想象,將代碼延遲在函數(shù)的入口和出口使用是非常有用的功能,尤其是在調(diào)試代碼的時(shí)候。

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

相關(guān)文章

  • GO語(yǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)

    GO語(yǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)

    本文介紹了如何使用GO語(yǔ)言對(duì)接支付寶沙箱環(huán)境,包括秘鑰生成、SDK安裝和代碼實(shí)現(xiàn)等步驟,詳細(xì)內(nèi)容涵蓋了從秘鑰生成到前端代碼的每個(gè)階段,為開發(fā)者提供了一條清晰的指引
    2024-09-09
  • 如何使用go-zero開發(fā)線上項(xiàng)目

    如何使用go-zero開發(fā)線上項(xiàng)目

    這篇文章主要介紹了如何使用go-zero開發(fā)線上項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • golang http使用踩過(guò)的坑與填坑指南

    golang http使用踩過(guò)的坑與填坑指南

    這篇文章主要介紹了golang http使用踩過(guò)的坑與填坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    這篇文章主要介紹了Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 圖文詳解Go程序如何編譯并運(yùn)行起來(lái)的

    圖文詳解Go程序如何編譯并運(yùn)行起來(lái)的

    Go語(yǔ)言這兩年在語(yǔ)言排行榜上的上升勢(shì)頭非常猛,Go語(yǔ)言雖然是靜態(tài)編譯型語(yǔ)言,但是它卻擁有腳本化的語(yǔ)法,下面這篇文章主要給大家介紹了關(guān)于Go程序如何編譯并運(yùn)行起來(lái)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用

    Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用

    本文主要介紹了Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解如何使用Golang實(shí)現(xiàn)Cron定時(shí)任務(wù)

    詳解如何使用Golang實(shí)現(xiàn)Cron定時(shí)任務(wù)

    定時(shí)任務(wù)是許多應(yīng)用程序中常見的一種需求,它們可以用于執(zhí)行定期的清理任務(wù),發(fā)送通知,生成報(bào)告等,在這篇博客中,我們將介紹如何在Go語(yǔ)言中使用robfig/cron包來(lái)實(shí)現(xiàn)Cron定時(shí)任務(wù),需要的朋友可以參考下
    2024-04-04
  • GORM框架實(shí)現(xiàn)分頁(yè)的示例代碼

    GORM框架實(shí)現(xiàn)分頁(yè)的示例代碼

    本文主要介紹了GORM框架實(shí)現(xiàn)分頁(yè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 詳解Golang如何使用Debug庫(kù)優(yōu)化代碼

    詳解Golang如何使用Debug庫(kù)優(yōu)化代碼

    這篇文章將針對(duì)Golang的debug庫(kù)進(jìn)行全面解讀,涵蓋其核心組件、高級(jí)功能和實(shí)戰(zhàn)技巧,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2024-02-02
  • go的websocket實(shí)現(xiàn)原理與用法詳解

    go的websocket實(shí)現(xiàn)原理與用法詳解

    這篇文章主要介紹了go的websocket實(shí)現(xiàn)原理與用法,詳細(xì)分析了websocket的功能、原理及Go語(yǔ)言實(shí)現(xiàn)websocket的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07

最新評(píng)論

娄底市| 淄博市| 若尔盖县| 深圳市| 雷山县| 耒阳市| 茌平县| 临沧市| 芦溪县| 宜川县| 色达县| 济阳县| 铜山县| 梓潼县| 鄂伦春自治旗| 来安县| 土默特左旗| 洛南县| 松滋市| 女性| 息烽县| 台安县| 合肥市| 苍南县| 秦皇岛市| 望谟县| 晋宁县| 海晏县| 饶河县| 普兰店市| 同江市| 阜宁县| 永济市| 五原县| 新晃| 措美县| 华蓥市| 临海市| 怀安县| 额敏县| 方城县|