日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go語(yǔ)言中關(guān)鍵字defer使用方法

在Go語(yǔ)言中,可以使用關(guān)鍵字defer向函數(shù)注冊(cè)退出調(diào)用,即主函數(shù)退出時(shí),defer后的函數(shù)才被調(diào)用。defer語(yǔ)句的作用是不管程序是否出現(xiàn)異常,均在函數(shù)退出時(shí)自動(dòng)執(zhí)行相關(guān)代碼。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名網(wǎng)站空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、望江網(wǎng)站維護(hù)、網(wǎng)站推廣。

但是,你還可以使用defer在任何函數(shù)開(kāi)始后和結(jié)束前執(zhí)行配對(duì)的代碼。這個(gè)隱藏的功能在網(wǎng)上的教程和書(shū)籍中很少提到。要使用此功能,需要?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ù)開(kāi)始時(shí)(由 defer 語(yǔ)句放置的位置決定)立即執(zhí)行。

這為開(kāi)發(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í)候。


網(wǎng)站欄目:Go語(yǔ)言中關(guān)鍵字defer使用方法
URL鏈接:http://m.5511xx.com/article/dpsjppj.html