亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談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ù)可以訪問完整的詞法環(huán)境(lexical environment),這意味著在函數(shù)中定義的內(nèi)部函數(shù)可以引用該函數(shù)的變量。在下一個(gè)示例中看到的,參數(shù)變量在measure函數(shù)第一次執(zhí)行和其延遲執(zhí)行的子函數(shù)內(nèi)都能訪問到:

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ù)中訪問到,這樣就能將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)文章

  • 使用Golang生成壓縮文件的詳細(xì)教程

    使用Golang生成壓縮文件的詳細(xì)教程

    與其他語(yǔ)言一樣,內(nèi)置標(biāo)準(zhǔn)庫(kù)默認(rèn)支持文件壓縮功能,本文介紹Golang如何創(chuàng)建壓縮文件,增加一個(gè)或多個(gè)文件生成壓縮文件,也可以在壓縮文件中創(chuàng)建文件夾,用于對(duì)文件進(jìn)行分類管理,Golang標(biāo)準(zhǔn)庫(kù) archive/zip提供了創(chuàng)建和讀取壓縮文件功能,需要的朋友可以參考下
    2024-01-01
  • 在Golang中執(zhí)行Shell命令的教程詳解

    在Golang中執(zhí)行Shell命令的教程詳解

    在本教程中,我們將學(xué)習(xí)如何在 Golang 中執(zhí)行shell命令(如 ls、mkdir 或 grep ),我們還將學(xué)習(xí)如何通過(guò) stdin 和 stdout 傳遞 I/O 到正在運(yùn)行的命令,以及管理長(zhǎng)時(shí)間運(yùn)行的命令,感興趣的同學(xué)可以借鑒一下
    2023-05-05
  • Golang中處理import自定義包出錯(cuò)問題的解決辦法

    Golang中處理import自定義包出錯(cuò)問題的解決辦法

    最近開始使用Go/GoLand在import自定義包時(shí)出現(xiàn)各種狀況,下面這篇文章主要給大家介紹了關(guān)于Golang中處理import自定義包出錯(cuò)問題的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀

    Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀

    這篇文章主要為大家介紹了Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go打包靜態(tài)文件的兩種方式

    Go打包靜態(tài)文件的兩種方式

    使用 Go 開發(fā)應(yīng)用的時(shí)候,有時(shí)會(huì)遇到需要讀取靜態(tài)資源的情況,如果不打包處理這種靜態(tài)文件:發(fā)布單獨(dú)掛載這種靜態(tài)文件相對(duì)比較麻煩,就有人會(huì)想辦法把靜態(tài)資源文件打包進(jìn) Go 的程序文件中,下面介紹兩種打包方式:go-bindata、go:embed,需要的朋友可以參考下
    2024-04-04
  • IdeaGo啟動(dòng)報(bào)錯(cuò)Failed to create JVM的問題解析

    IdeaGo啟動(dòng)報(bào)錯(cuò)Failed to create JVM的問題解析

    這篇文章主要介紹了IdeaGo啟動(dòng)報(bào)錯(cuò)Failed to create JVM的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Go 庫(kù)bytes.Buffer和strings.Builder使用及性能對(duì)比

    Go 庫(kù)bytes.Buffer和strings.Builder使用及性能對(duì)比

    這篇文章主要為大家介紹了Go 庫(kù)bytes.Buffer和strings.Builder使用及性能對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang的關(guān)鍵字defer的使用方法

    Golang的關(guān)鍵字defer的使用方法

    這篇文章主要介紹了Golang的關(guān)鍵字defer的使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • go語(yǔ)言中時(shí)間戳格式化的方法

    go語(yǔ)言中時(shí)間戳格式化的方法

    這篇文章主要介紹了go語(yǔ)言中時(shí)間戳格式化的方法,涉及Go語(yǔ)言中time的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)?lái)了完整代碼,感興趣的朋友跟隨小編一起看看吧
    2021-12-12

最新評(píng)論