婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

前言

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

下面對defer進行介紹。

defer特性

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

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

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

1.延遲調(diào)用

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

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

編譯運行:

2.defer 與 return 孰先孰后

defer 和 return 到底是哪個先調(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 )

編譯運行:

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

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

重點在第三行,為什么輸出的是 go ?

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

3.多個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)
}

編譯輸出:

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

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ù)“壓棧”,函數(shù)參數(shù)會被拷貝下來;當外層函數(shù)(非代碼塊,如一個for循環(huán))退出時,defer函數(shù)按照定義的逆序執(zhí)行;如果defer執(zhí)行的函數(shù)為nil, 那么會在最終調(diào)用函數(shù)的產(chǎn)生panic.

為什么需要defer?

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

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

defer用途

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

2. 鎖資源釋放

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

defer的使用其實非常簡單,來看看一個簡單用途:

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é)束之前,會自動執(zhí)行defer后面的語句來關(guān)閉文件。

當然,defer會有小小地延遲,對時間要求特別特別特別高的程序,可以避免使用它。

總結(jié)

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

補充:Golang中defer的三個實戰(zhàn)要點

前言

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

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

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

1.defer的生效順序

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

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

正文

1.defer的生效順序

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

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

執(zhí)行后打印出:

我先出來

我后出來

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

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

返回值的表達方式,我們知道根據(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的時候已經(jīng)先將返回值給定義下來了,就是0,由于i是在函數(shù)內(nèi)部聲明所以即使在defer中進行了++操作,也不會影響return的時候做的決定。

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的時候決定的返回值還是0,但是后面兩個defer執(zhí)行后進行了兩次++,將i的值變?yōu)?,待defer執(zhí)行完后,函數(shù)將i值進行了返回。

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

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

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Golang之defer 延遲調(diào)用操作》,本文關(guān)鍵詞  Golang,之,defer,延遲,調(diào)用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(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蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产激情一区二区三区桃花岛亚洲| 亚洲一二三区在线观看| 国产精品美女一区二区三区| 精品一区二区三区蜜桃| 欧美xxxx老人做受| 精品在线一区二区| 久久久精品免费网站| 国产白丝精品91爽爽久久| 国产亚洲综合av| jlzzjlzz国产精品久久| 亚洲乱码日产精品bd| 欧美日韩精品三区| 久久99久久精品欧美| 久久久青草青青国产亚洲免观| 成人免费三级在线| 亚洲最大成人综合| 亚洲精品一区二区三区在线观看| 国产乱子轮精品视频| 亚洲视频一区二区在线观看| 欧美日韩在线观看一区二区 | 欧美精品一区二区在线播放| 国产精品主播直播| 曰韩精品一区二区| 日韩欧美国产1| 不卡在线观看av| 日韩**一区毛片| 国产欧美精品一区| 欧美欧美午夜aⅴ在线观看| 国产主播一区二区| 亚洲一二三四久久| 国产精品青草久久| 9191国产精品| 色视频成人在线观看免| 精品一区二区三区欧美| 亚洲一本大道在线| 最新日韩在线视频| 久久久久久久网| 欧美一区午夜视频在线观看| 91小宝寻花一区二区三区| 极品瑜伽女神91| 亚洲va欧美va人人爽午夜| 国产精品天干天干在观线| 日韩欧美电影一二三| 欧美性猛交一区二区三区精品| 国产剧情一区二区| 日本视频在线一区| 亚洲一区二区三区小说| 国产三级精品三级在线专区| 欧美性极品少妇| 成人v精品蜜桃久久一区| 免费在线成人网| 亚洲成av人影院| 亚洲综合色丁香婷婷六月图片| 欧美国产日产图区| 久久久久久久综合狠狠综合| 日韩亚洲欧美高清| 94色蜜桃网一区二区三区| 国产一区在线精品| 韩国精品主播一区二区在线观看 | 欧美男女性生活在线直播观看| 高清国产一区二区| 石原莉奈在线亚洲三区| 亚洲第一二三四区| 丝袜美腿成人在线| 亚洲一区二区精品3399| 亚洲综合久久久| 中文字幕一区在线观看| 国产精品麻豆一区二区| 日本一区二区免费在线| 欧美一级精品在线| 日韩欧美成人一区| 日韩久久免费av| 欧美成人福利视频| 5月丁香婷婷综合| 99re热这里只有精品免费视频 | 国产99久久久精品| 亚洲影院久久精品| 亚洲韩国精品一区| 亚洲一二三四区| 丝袜美腿亚洲一区| **网站欧美大片在线观看| 欧美国产1区2区| 国产精品不卡视频| 国产精品久久久久久久久久久免费看 | 在线亚洲一区观看| 色综合天天狠狠| 在线观看日韩一区| 欧美久久一二区| 欧美精品九九99久久| 亚洲精品在线免费播放| 中文字幕不卡在线观看| 亚洲男同1069视频| 亚洲韩国精品一区| 亚洲高清不卡在线观看| 日本怡春院一区二区| 免费成人av资源网| 不卡一区二区三区四区| 成人免费看黄yyy456| 不卡视频在线观看| 欧美精品高清视频| 26uuu欧美| 17c精品麻豆一区二区免费| 亚洲欧美激情在线| 日韩精品乱码免费| 极品少妇xxxx精品少妇偷拍| 国产精品69毛片高清亚洲| 99国产精品视频免费观看| 欧美美女激情18p| 日韩久久精品一区| 一区二区三区欧美| 日韩精品视频网站| 欧美性色aⅴ视频一区日韩精品| 日韩欧美国产系列| 亚洲一区在线免费观看| 国产精一品亚洲二区在线视频| 色激情天天射综合网| 26uuu另类欧美| 日韩福利视频网| 色综合天天综合给合国产| 欧美一区二区三区小说| 国产三级精品三级| 久久精品国产一区二区| 在线一区二区视频| 久久久电影一区二区三区| 亚洲成人精品在线观看| 99精品欧美一区| 久久综合九色综合97婷婷| 亚洲va韩国va欧美va| 不卡av电影在线播放| 精品女同一区二区| 首页国产欧美日韩丝袜| 亚洲精品一区二区精华| 国产iv一区二区三区| 久久久久久久综合色一本| 蜜桃免费网站一区二区三区| 欧美视频中文字幕| 亚洲与欧洲av电影| 日本精品裸体写真集在线观看| 国产片一区二区| 国产成a人亚洲| 国产无人区一区二区三区| 九九视频精品免费| 日韩欧美国产精品| 欧美日韩一区二区欧美激情| 亚洲人成网站精品片在线观看| 国产精品影音先锋| 久久久www成人免费无遮挡大片| 青青草原综合久久大伊人精品| 欧美日韩中文国产| 亚洲成人av福利| 欧美一区二区三区免费观看视频| 水蜜桃久久夜色精品一区的特点| 欧美精选在线播放| 日本麻豆一区二区三区视频| 欧美一二三四在线| 天天综合网 天天综合色| 欧美老肥妇做.爰bbww视频| 日韩毛片精品高清免费| 91麻豆.com| 亚洲成av人片www| 日韩欧美在线一区二区三区| 免费精品视频在线| 国产欧美一区二区精品性| 成人v精品蜜桃久久一区| 亚洲精品va在线观看| 欧美日本一区二区| 久久国产视频网| 国产精品视频线看| 色视频成人在线观看免| 免费看日韩精品| 国产精品女同互慰在线看| 欧美色倩网站大全免费| 毛片不卡一区二区| 国产九九视频一区二区三区| 久久蜜桃av一区精品变态类天堂| 成人精品一区二区三区四区 | 91污在线观看| 日产国产欧美视频一区精品| 26uuu国产日韩综合| 不卡av电影在线播放| 亚洲午夜电影在线| 欧美电影免费观看高清完整版在线| 国产99精品国产| 午夜婷婷国产麻豆精品| 国产午夜亚洲精品午夜鲁丝片| 欧洲生活片亚洲生活在线观看| 蜜桃av噜噜一区| 亚洲一区二区三区在线| 欧美精彩视频一区二区三区| 亚洲黄色av一区| 中文字幕欧美三区| 欧美一级免费观看| 色成年激情久久综合| 国产精品一区二区久久不卡| 亚洲成人精品在线观看| 亚洲欧洲性图库| 久久久久久久电影| 日韩欧美一区在线| 欧美日韩一区二区在线视频| 99免费精品在线观看|