中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-10 11:20:35 來源:億速云 閱讀:135 作者:小新 欄目:編程語言

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

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

但是,你還可以使用defer在任何函數開始后和結束前執行配對的代碼。這個隱藏的功能在網上的教程和書籍中很少提到。要使用此功能,需要創建一個函數并使它本身返回另一個函數,返回的函數將作為真正的延遲函數。在 defer 語句調用父函數后在其上添加額外的括號來延遲執行返回的子函數如下所示:

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

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

輸出以下內容:

Hello!
Some code here...
Bye!

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

這為開發者提供了什么能力?因為在函數內定義的匿名函數可以訪問完整的詞法環境(lexical environment),這意味著在函數中定義的內部函數可以引用該函數的變量。在下一個示例中看到的,參數變量在measure函數第一次執行和其延遲執行的子函數內都能訪問到:

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)) }
}

輸出以下內容:

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

此外函數命名的返回值也是函數內的局部變量,所以上面例子中的measure函數如果接收命名返回值作為參數的話,那么命名返回值在延遲執行的函數中訪問到,這樣就能將measure函數改造成記錄入參和返回值的工具函數。

下面的示例是引用《go 語言程序設計》中的代碼段:

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)) 
  }
}

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

以上是“go中defer隱藏功能的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闻喜县| 嘉荫县| 翼城县| 高邑县| 龙陵县| 友谊县| 诏安县| 维西| 舒兰市| 云梦县| 佛山市| 津市市| 泾川县| 班戈县| 县级市| 石景山区| 马公市| 大关县| 东平县| 任丘市| 三台县| 塔城市| 青阳县| 石家庄市| 罗甸县| 苏尼特左旗| 汨罗市| 保山市| 太谷县| 临沂市| 滨海县| 河池市| 仪陇县| 韩城市| 宜川县| 延川县| 油尖旺区| 商洛市| 盐边县| 姜堰市| 句容市|