欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

go中defer隱藏功能的示例分析

小編給大家分享一下go中defer隱藏功能的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是一家專業(yè)提供雞東企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為雞東眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。

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

但是,你還可以使用defer在任何函數(shù)開始后和結(jié)束前執(zhí)行配對的代碼。這個隱藏的功能在網(wǎng)上的教程和書籍中很少提到。要使用此功能,需要創(chuàng)建一個函數(shù)并使它本身返回另一個函數(shù),返回的函數(shù)將作為真正的延遲函數(shù)。在 defer 語句調(diào)用父函數(shù)后在其上添加額外的括號來延遲執(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ù)開始時(由 defer 語句放置的位置決定)立即執(zhí)行。

這為開發(fā)者提供了什么能力?因為在函數(shù)內(nèi)定義的匿名函數(shù)可以訪問完整的詞法環(huán)境(lexical environment),這意味著在函數(shù)中定義的內(nèi)部函數(shù)可以引用該函數(shù)的變量。在下一個示例中看到的,參數(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 語言程序設(shè)計》中的代碼段:

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)試代碼的時候。

以上是“go中defer隱藏功能的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

標題名稱:go中defer隱藏功能的示例分析
標題來源:http://aaarwkj.com/article46/gpjpeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)定制網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站排名、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
av天堂黄色在线观看| 97人妻人人澡人人爽| 亚洲精品国产自在现线| 欧美一区二区亚洲天堂| 伊在人天堂亚洲香蕉精品区| 欧美亚洲精品二区久久久| 精品国产一区二区三级四区| 青草视频在线播放免费| 国产精品久久中文字幕网| 高清在线一区二区在线| 欧美一级特黄大片做受农村| 日韩中文字幕久久中文字幕| 欧美一区二区日韩一区二区| 久久五十路初次拍五十路| 野花日本免费高清完整| 日韩精品日本道欧美黄片| 日韩精品女性三级视频 | 久久精品国产av极品| 国产成人综合亚洲欧美在线| 91嫩草中文字幕在线| 久久精品成人无码观看56| 亚洲av一区二区三区色多多| 91蜜臀在线视频播放| 18禁黄网站免费观看在线| 欧美精品一区二区三区黄片| 欧美日韩视频一区二区| 久久不卡高清免费av| 日韩欧美第一页在线观看| 老湿机午夜十分钟视频| 四影虎影永久免费观看| 一区二区三区成人高清视频| 国产精品一区二区三区四区久久| 午夜精品人妻一区二区| 成人精品超碰一区二区| 深夜十八禁在线免费观看| 日韩爱爱特级视频中文字幕| 国产av一级二级三级最新精品 | 囗交囗爆吞精在线视频| 欧美精品欧美精品一区二区| av免费在线观看麻豆| 少妇被按摩高潮在线观看|