校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > Golang之defer 延遲調(diào)用操作

Golang之defer 延遲調(diào)用操作

熱門標(biāo)簽:仙桃400電話辦理 重慶慶云企業(yè)400電話到哪申請(qǐng) 上海極信防封電銷卡價(jià)格 寧波語音外呼系統(tǒng)公司 地圖標(biāo)注免費(fèi)定制店 宿遷便宜外呼系統(tǒng)代理商 湛江crm外呼系統(tǒng)排名 不封卡外呼系統(tǒng) 鄭州智能語音電銷機(jī)器人價(jià)格

前言

defer語句被用于預(yù)定對(duì)一個(gè)函數(shù)的調(diào)用。我們把這類被defer語句調(diào)用的函數(shù)稱為延遲函數(shù)。而defer 延遲語句在其他編程語言里好像沒有見到。應(yīng)該是屬于 Go 語言里的獨(dú)有的關(guān)鍵字。但用法類似于面向?qū)ο缶幊陶Z言 Java 和 C# 的 finally 語句塊。

下面對(duì)defer進(jìn)行介紹。

defer特性

1. 關(guān)鍵字 defer 用于注冊(cè)延遲調(diào)用。

2. 這些調(diào)用直到 return 前才被執(zhí)。因此,可以用來做資源清理。

3. 多個(gè)defer語句,按先進(jìn)后出的方式執(zhí)行。

1.延遲調(diào)用

用法很簡(jiǎn)單,只需要在函數(shù)前面加上 defer就行,就能實(shí)現(xiàn)將這個(gè) 該函數(shù)的調(diào)用延遲到當(dāng)前函數(shù)執(zhí)行完后再執(zhí)行。例如:

package main 
import (
 "fmt"
)
func myFunc(){
 fmt.Println("minger")
}
func main(){
 defer myFunc() //等價(jià)于defer fmt.Println("minger")
 fmt.Println("程序猿編碼")
}

編譯運(yùn)行:

2.defer 與 return 孰先孰后

defer 和 return 到底是哪個(gè)先調(diào)用?先看看例子:

package main 
import (
 "fmt"
)
var name string = "go"
func myFunc() string {
  defer func() {
    name = "python"
  }()
  fmt.Println("myFunc 函數(shù)里的name:", name)
  return name
}
func main() {
  myName := myFunc()
  fmt.Println("main 函數(shù)里的name: ", name)
  fmt.Println("main 函數(shù)里的myname: ", myName )

編譯運(yùn)行:

來看看打印信息,第一行輸出,name 此時(shí)還是全局變量,值還是go

第二行輸出,在 defer 里改變了全局變量,此時(shí)name的值已經(jīng)變成了 python

重點(diǎn)在第三行,為什么輸出的是 go ?

解釋只有一個(gè),那就是 defer 是return 后才調(diào)用的。所以在執(zhí)行 defer 前,myName 已經(jīng)被賦值成 go 了。

3.多個(gè)defer 逆序執(zhí)行

還是老規(guī)矩先來上代碼,看看輸出信息,例子:

package main 
import (
 "fmt"
)
func main(){
 name := "go"
 defer fmt.Println(name)
 name = "C/C++"
 defer fmt.Println(name)
 name = "Python"
 fmt.Println(name)
}

編譯輸出:

可見 多個(gè)defer 是它們會(huì)以逆序執(zhí)行(類似棧,即后進(jìn)先出)。

defer官方的解釋

Each time a “defer” statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked. Instead, deferred functions are invoked immediately before the surrounding function returns, in the reverse order they were deferred. If a deferred function value evaluates to nil, execution panics when the function is invoked, not when the “defer” statement is executed.

翻譯一下:

每次defer語句執(zhí)行的時(shí)候,會(huì)把函數(shù)“壓棧”,函數(shù)參數(shù)會(huì)被拷貝下來;當(dāng)外層函數(shù)(非代碼塊,如一個(gè)for循環(huán))退出時(shí),defer函數(shù)按照定義的逆序執(zhí)行;如果defer執(zhí)行的函數(shù)為nil, 那么會(huì)在最終調(diào)用函數(shù)的產(chǎn)生panic.

為什么需要defer?

往往我們?cè)诰幊痰臅r(shí)候,經(jīng)常需要打開一些資源,比如數(shù)據(jù)庫連接、文件、鎖等,這些資源需要在用完之后釋放掉,否則會(huì)造成內(nèi)存泄漏。

因此我們有時(shí)會(huì)忘記關(guān)閉這些資源。Golang直接在語言層面提供defer關(guān)鍵字,在打開資源語句的下一行,就可以直接用defer語句來注冊(cè)函數(shù)結(jié)束后執(zhí)行關(guān)閉資源的操作。

defer用途

1. 關(guān)閉文件句柄

2. 鎖資源釋放

3. 數(shù)據(jù)庫連接釋放

defer的使用其實(shí)非常簡(jiǎn)單,來看看一個(gè)簡(jiǎn)單用途:

package main
import (
 "log"
 "os"
)
func main() {
 f, err := os.OpenFile("text.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) //文件沒有就創(chuàng)建,文件存在就追加
 if err != nil {
 log.Fatal(err)
 }
 defer f.Close()
 f.WriteString("程序猿編碼\n")
}

編譯輸出:

在打開文件的語句附近,用defer語句關(guān)閉文件。這樣,在函數(shù)結(jié)束之前,會(huì)自動(dòng)執(zhí)行defer后面的語句來關(guān)閉文件。

當(dāng)然,defer會(huì)有小小地延遲,對(duì)時(shí)間要求特別特別特別高的程序,可以避免使用它。

總結(jié)

defer 語句經(jīng)常使用于成對(duì)的操作,比如打開和關(guān)閉,連接和斷開,加鎖和解鎖,即便是再復(fù)雜的控制流,資源在任何情況下都能夠正確釋放。

補(bǔ)充:Golang中defer的三個(gè)實(shí)戰(zhàn)要點(diǎn)

前言

Golang中的defer是使用頻次比較高的,能創(chuàng)造出延遲生效特效的一種方式。

defer也有自己的矯情,需要注意的。

本文將從通過代碼的方式來說明defer的三點(diǎn)矯情。

1.defer的生效順序

2.defer與return,函數(shù)返回值之間的順序

3.defer定義和執(zhí)行兩個(gè)步驟,做的事情。

正文

1.defer的生效順序

先說結(jié)論:defer的執(zhí)行順序是倒序執(zhí)行(同入棧先進(jìn)后出)

func main() {
 defer func() {
 fmt.Println("我后出來")
 }()
 defer func() {
 fmt.Println("我先出來")
 }()
}

執(zhí)行后打印出:

我先出來

我后出來

2.defer與return,函數(shù)返回值之間的順序

先說結(jié)論:return最先執(zhí)行->return負(fù)責(zé)將結(jié)果寫入返回值中->接著defer開始執(zhí)行一些收尾工作->最后函數(shù)攜帶當(dāng)前返回值退出

返回值的表達(dá)方式,我們知道根據(jù)是否提前聲明有兩種方式:一種是func test() int 另一種是 func test() (i int),所以兩種情況都來說說

func test() int
func main() {
 fmt.Println("main:", test())
}
func test() int {
 var i int
 defer func() {
 i++
 fmt.Println("defer2的值:", i)
 }()
 defer func() {
 i++
 fmt.Println("defer1的值:", i)
 }()
 return i
}

輸出:

defer1的值: 1

defer2的值: 2

main: 0

詳解:return的時(shí)候已經(jīng)先將返回值給定義下來了,就是0,由于i是在函數(shù)內(nèi)部聲明所以即使在defer中進(jìn)行了++操作,也不會(huì)影響return的時(shí)候做的決定。

func test() (i int)
func main() {
 fmt.Println("main:", test())
}
func test() (i int) {
 defer func() {
 i++
 fmt.Println("defer2的值:", i)
 }()
 defer func() {
 i++
 fmt.Println("defer1的值:", i)
 }()
 return i
}

輸出:

defer1的值: 1

defer2的值: 2

main: 2

詳解:由于返回值提前聲明了,所以在return的時(shí)候決定的返回值還是0,但是后面兩個(gè)defer執(zhí)行后進(jìn)行了兩次++,將i的值變?yōu)?,待defer執(zhí)行完后,函數(shù)將i值進(jìn)行了返回。

3.defer定義和執(zhí)行兩個(gè)步驟,做的事情

先說結(jié)論:會(huì)先將defer后函數(shù)的參數(shù)部分的值(或者地址)給先下來【你可以理解為()里頭的會(huì)先確定】,后面函數(shù)執(zhí)行完,才會(huì)執(zhí)行defer后函數(shù)的{}中的邏輯

func test(i *int) int {
 return *i
}
func main(){
 var i = 1
 // defer定義的時(shí)候test(i)的值就已經(jīng)定了,是1,后面就不會(huì)變了
 defer fmt.Println("i1 =" , test(i))
 i++
 // defer定義的時(shí)候test(i)的值就已經(jīng)定了,是2,后面就不會(huì)變了
 defer fmt.Println("i2 =" , test(i))
 // defer定義的時(shí)候,i就已經(jīng)確定了是一個(gè)指針類型,地址上的值變了,這里跟著變
 defer func(i *int) {
 fmt.Println("i3 =" , *i)
 }(i)
 // defer定義的時(shí)候i的值就已經(jīng)定了,是2,后面就不會(huì)變了
 defer func(i int) {
 //defer 在定義的時(shí)候就定了
 fmt.Println("i4 =" , i)
 }(i)
 defer func() {
 // 地址,所以后續(xù)跟著變
 var c = i
 fmt.Println("i5 =" , *c)
 }()
 
 // 執(zhí)行了 i=11 后才調(diào)用,此時(shí)i值已是11
 defer func() {
 fmt.Println("i6 =" , i)
 }()
 i = 11
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 聊聊golang的defer的使用
  • Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)
  • golang中defer的關(guān)鍵特性示例詳解
  • golang中defer的使用規(guī)則詳解
  • Golang巧用defer進(jìn)行錯(cuò)誤處理的方法
  • Golang 的defer執(zhí)行規(guī)則說明

標(biāo)簽:電子產(chǎn)品 遼寧 青海 海南 西雙版納 物業(yè)服務(wù) 安康 儋州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang之defer 延遲調(diào)用操作》,本文關(guān)鍵詞  Golang,之,defer,延遲,調(diào)用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang之defer 延遲調(diào)用操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang之defer 延遲調(diào)用操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩国产欧美视频| 中文字幕高清一区| 久久看人人爽人人| 亚洲日韩欧美一区二区在线| 亚洲一区在线电影| 精品在线播放午夜| 成人91在线观看| 精品视频999| 国产视频在线观看一区二区三区| 亚洲丝袜自拍清纯另类| 天天操天天干天天综合网| 国产一区二区毛片| 欧美色大人视频| 国产亚洲短视频| 亚洲电影一级黄| 国产成人精品影视| 欧美精品在线观看一区二区| 久久精品视频在线看| 婷婷一区二区三区| 国产精品久久久久婷婷二区次| 亚洲狠狠爱一区二区三区| 国产99一区视频免费| 制服丝袜激情欧洲亚洲| 国产精品久久久久婷婷| 蜜桃精品视频在线观看| 91女神在线视频| 久久久久99精品国产片| 日韩和欧美的一区| 色综合久久综合| 久久综合999| 日日夜夜精品免费视频| av午夜一区麻豆| 久久五月婷婷丁香社区| 无码av免费一区二区三区试看 | 日韩欧美一区二区视频| 亚洲精品免费播放| 国产一区福利在线| 欧美一区二区大片| 一区二区三区**美女毛片| 国产成人免费在线视频| 日韩一区二区在线观看| 亚洲一区av在线| av电影在线不卡| 国产亚洲精久久久久久| 捆绑调教一区二区三区| 欧美精品日韩一本| 亚洲一区日韩精品中文字幕| 成人黄色小视频在线观看| 欧美精品一区二区三区在线播放 | 欧美一区二区三区小说| 亚洲一区二区三区美女| a级精品国产片在线观看| 国产色婷婷亚洲99精品小说| 久久99国产精品免费网站| 欧美一区二区三区在线看| 亚洲国产一区二区三区青草影视| 色综合网色综合| 亚洲欧洲精品天堂一级 | 中文字幕日本乱码精品影院| 国产综合色在线视频区| 日韩亚洲欧美综合| 日本不卡不码高清免费观看| 欧美福利电影网| 午夜久久久久久久久久一区二区| 欧美亚洲另类激情小说| 亚洲激情网站免费观看| 色狠狠桃花综合| 亚洲日本免费电影| 91国模大尺度私拍在线视频| 18成人在线观看| 色婷婷综合久久久中文字幕| 亚洲男女一区二区三区| 91麻豆精品在线观看| 亚洲乱码国产乱码精品精98午夜 | 亚洲男人天堂av| 91视频国产观看| 亚洲精选在线视频| 欧美写真视频网站| 亚洲成人免费在线| 日韩免费视频线观看| 黄色日韩网站视频| 国产精品美女久久久久久2018| 成人一级视频在线观看| 成人欧美一区二区三区小说 | 五月综合激情日本mⅴ| 欧美精品一二三区| 精彩视频一区二区三区| 国产视频不卡一区| 色婷婷久久综合| 天天操天天色综合| 精品国产一区二区三区四区四 | 国产欧美精品日韩区二区麻豆天美| 懂色av一区二区夜夜嗨| 中文字幕在线一区二区三区| 成人av资源网站| 亚洲制服欧美中文字幕中文字幕| 欧美日韩久久一区| 久久国产成人午夜av影院| 亚洲国产精品黑人久久久| 日本精品一区二区三区高清 | 精品国产露脸精彩对白| 成人免费高清视频| 国产大陆亚洲精品国产| 中文字幕乱码一区二区免费| 91高清视频在线| 婷婷国产v国产偷v亚洲高清| 欧美精品一区二区三区很污很色的| 久久99国产精品尤物| 中文字幕不卡在线观看| 色婷婷av一区二区三区之一色屋| 日韩精品欧美精品| 久久久久国产免费免费| 91免费国产在线| 免费久久精品视频| 综合色中文字幕| 欧美电影免费观看高清完整版在线观看 | 国产乱人伦偷精品视频免下载 | 成人国产一区二区三区精品| 亚洲视频一二三区| 91精品午夜视频| 丁香一区二区三区| 亚洲成人一区二区在线观看| 久久久天堂av| 欧美视频你懂的| 成人免费毛片app| 偷拍亚洲欧洲综合| 国产精品无圣光一区二区| 欧美高清精品3d| 91蜜桃免费观看视频| 精一区二区三区| 亚洲国产精品一区二区久久恐怖片 | 亚洲福利国产精品| 国产欧美一区二区精品性色| 欧美日韩成人在线| 91啪九色porn原创视频在线观看| 国内偷窥港台综合视频在线播放| 一区二区国产盗摄色噜噜| 国产欧美一区在线| 日韩美女视频在线| 精品视频一区三区九区| 91在线丨porny丨国产| 精品无人码麻豆乱码1区2区| 亚洲成人动漫av| 成人欧美一区二区三区小说 | av一区二区三区四区| 久久精品国产一区二区三 | 日韩一区二区不卡| 在线亚洲高清视频| av中文字幕在线不卡| 国产原创一区二区三区| 免费人成网站在线观看欧美高清| 亚洲线精品一区二区三区八戒| 国产精品久线在线观看| 久久一二三国产| 欧美一区二区三区白人| 欧美视频中文字幕| 91免费国产视频网站| av高清久久久| 成人精品视频一区| 国产福利一区二区三区视频| 六月丁香婷婷久久| 日日夜夜精品视频天天综合网| 亚洲一二三四久久| 亚洲精品菠萝久久久久久久| 亚洲婷婷在线视频| 亚洲三级在线看| 亚洲欧美偷拍另类a∨色屁股| 国产精品久久久久四虎| 国产精品久久久久一区| 国产女主播视频一区二区| 国产日韩欧美精品在线| 久久久夜色精品亚洲| 久久综合成人精品亚洲另类欧美| 精品国产乱码久久久久久夜甘婷婷| 欧美一区二区视频网站| 日韩午夜精品视频| 日韩午夜三级在线| 亚洲激情校园春色| 亚洲精品自拍动漫在线| 亚洲手机成人高清视频| 亚洲靠逼com| 亚洲一区二区精品久久av| 一区二区三区中文字幕在线观看| 夜夜夜精品看看| 五月婷婷色综合| 免费欧美高清视频| 国内成人精品2018免费看| 精品一区二区三区在线视频| 精一区二区三区| 国产成人午夜99999| 成年人午夜久久久| 一本色道久久综合亚洲精品按摩| 91成人在线免费观看| 欧美日韩国产高清一区二区三区 | 久久精品99久久久| 久久99久久精品| 懂色av中文一区二区三区| 99久久伊人精品| 在线精品视频小说1| 777午夜精品视频在线播放|