国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí))

這篇具有很好參考價(jià)值的文章主要介紹了golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

什么是defer

defer語(yǔ)句用于golang程序中延遲函數(shù)的調(diào)用, 每次defer都會(huì)把一個(gè)函數(shù)壓入棧中, 函數(shù)返回前再把延遲的函數(shù)取出并執(zhí)行。

為了方便描述, 我們把創(chuàng)建defer的函數(shù)稱為主函數(shù), defer語(yǔ)句后面的函數(shù)稱為延遲函數(shù)。延遲函數(shù)可能有輸入?yún)?shù), 這些參數(shù)可能來(lái)源于定義defer的函數(shù), 延遲函數(shù)也可能引用主函數(shù)用于返回的變量, 也就是說(shuō)延遲函數(shù)可能會(huì)影響主函數(shù)的一些行為。

defer的規(guī)則

規(guī)則一:延遲函數(shù)的參數(shù)在defer語(yǔ)句出現(xiàn)時(shí)就已經(jīng)確定

package main

import "fmt"

func main() {
	deferFuncParameter()
}

func deferFuncParameter() {
	var aInt = 1
	defer fmt.Println(aInt)
	aInt = 2
	return
}

結(jié)果:
golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí)),golang,學(xué)習(xí),筆記
代碼說(shuō)明: 函數(shù)deferFuncParameter()定義一個(gè)整型變量并初始化為1,然后使用defer語(yǔ)句打印出變量值, 最后修改變量值為2。
參考答案: 輸出1。 延遲函數(shù)fmt.Println(aInt)的參數(shù)在defer語(yǔ)句出現(xiàn)時(shí)就已經(jīng)確定了, 后面修改的aInt變量實(shí)際上是拷貝了一份。所以無(wú)論后面如何修改aInt變量都不會(huì)影響延遲函數(shù)的執(zhí)行。
注意: 對(duì)于指針類型參數(shù), 規(guī)則仍然適用, 只不過(guò)延遲函數(shù)的參數(shù)是一個(gè)地址值, 這種情況下,defer后面的語(yǔ)句對(duì)變量的修改可能會(huì)影響延遲函數(shù)。

package main

import "fmt"

func main() {
	deferArray()
}

func printArray(array *[3]int)  {
	for i := range array {
		fmt.Println(array[i])
	}
}

func deferArray()  {
	var aArray = [3]int{1, 2, 3}
	defer printArray(&aArray)
	aArray[0] = 10
	return
}

結(jié)果:
golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí)),golang,學(xué)習(xí),筆記
函數(shù)說(shuō)明: 函數(shù)deferFuncParameter()定義一個(gè)數(shù)組, 通過(guò)defer延遲函數(shù)printArray()的調(diào)用, 最后修改數(shù)組第一個(gè)元素。 printArray()函數(shù)接受數(shù)組的指針并把數(shù)組全部打印出來(lái)。
參考答案: 輸出10、 2、 3三個(gè)值。 延遲函數(shù)printArray()的參數(shù)在defer語(yǔ)句出現(xiàn)時(shí)就已經(jīng)確定了, 即數(shù)組的地址, 由于延遲函數(shù)執(zhí)行時(shí)機(jī)是在return語(yǔ)句之前, 所以對(duì)數(shù)組的最終修改值會(huì)被打印出來(lái)。

規(guī)則二:defer延遲函數(shù)執(zhí)行按后進(jìn)先出順序執(zhí)行, 即先出現(xiàn)的defer最后執(zhí)行

定義defer類似于入棧操作, 執(zhí)行defer類似于出棧操作。

設(shè)計(jì)defer的初衷是簡(jiǎn)化函數(shù)返回時(shí)資源清理的動(dòng)作, 資源往往有依賴順序, 比如先申請(qǐng)A資源, 再跟據(jù)A資源申請(qǐng)B資源, 跟據(jù)B資源申請(qǐng)C資源, 即申請(qǐng)順序是:A—>B—>C, 釋放時(shí)往往又要反向進(jìn)行。 這就是把deffer設(shè)計(jì)成FIFO的原因。每申請(qǐng)到一個(gè)用完需要釋放的資源時(shí), 立即定義一個(gè)defer來(lái)釋放資源是個(gè)很好的習(xí)慣。

規(guī)則三: 延遲函數(shù)可能操作主函數(shù)的具名返回值

定義defer的函數(shù), 即主函數(shù)可能有返回值, 返回值有沒(méi)有名字沒(méi)有關(guān)系, defer所作用的函數(shù), 即延遲函數(shù)可能會(huì)影響到返回值。

package main

import "fmt"

func main() {
	fmt.Println(test())
}
func test() (res int) {
	a := 1
	defer func() {
		res ++
	}()
	return a
}

結(jié)果
golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí)),golang,學(xué)習(xí),筆記
函數(shù)說(shuō)明: 函數(shù)擁有一個(gè)具名返回值result, 函數(shù)內(nèi)部聲明一個(gè)變量a, defer指定一個(gè)延遲函數(shù), 最后返回變量a。延遲函數(shù)中遞增res。
參考答案: 函數(shù)輸出2。 函數(shù)的return語(yǔ)句并不是原子的, 實(shí)際執(zhí)行分為設(shè)置返回值—>ret, defer語(yǔ)句實(shí)際執(zhí)行在返回前, 即擁有defer的函數(shù)返回過(guò)程是: 設(shè)置返回值—>執(zhí)行defer—>res。 所以return語(yǔ)句先把res設(shè)置為a的值, 即1, defer語(yǔ)句中又把res遞增1, 所以最終返回2。
return 返回值解析
該函數(shù)的return語(yǔ)句可以拆分成下面兩行:

result = i
return

而延遲函數(shù)的執(zhí)行正是在return之前, 即加入defer后的執(zhí)行過(guò)程如下:

result = i
result++
return

一個(gè)主函數(shù)擁有一個(gè)匿名的返回值, 返回時(shí)使用字面值, 比如返回”1”、 ”2”、 ”Hello”這樣的值, 這種情況下defer語(yǔ)句是無(wú)法操作返回值的。
另外返回值是匿名類型的值,這種情況下defer語(yǔ)句可以引用到返回值, 但不會(huì)改變返回值。

package main

import "fmt"

func main() {
	fmt.Println(test())
}
func test() int {
	a := 1
	defer func() {
		a ++
	}()
	return a
}

func printArray(array *[3]int)  {
	for i := range array {
		fmt.Println(array[i])
	}
}

結(jié)果:
golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí)),golang,學(xué)習(xí),筆記
上面的函數(shù), 返回一個(gè)局部變量, 同時(shí)defer函數(shù)也會(huì)操作這個(gè)局部變量。 對(duì)于匿名返回值來(lái)說(shuō), 可以假定仍然有一個(gè)變量存儲(chǔ)返回值, 假定返回值變量為”anony”, 上面的返回語(yǔ)句可以拆分成以下過(guò)程:

anony = a
 a++
return

由于a是整型, 會(huì)將值拷貝給anony, 所以defer語(yǔ)句中修改i值, 對(duì)函數(shù)返回值不造成影響。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857658.html

總結(jié)

  1. defer定義的延遲函數(shù)參數(shù)在defer語(yǔ)句出時(shí)就已經(jīng)確定下來(lái)了
  2. defer定義順序與實(shí)際執(zhí)行順序相反
  3. return不是原子操作,執(zhí)行過(guò)程是: 保存返回值(若有)—>執(zhí)行defer( 若有) —>執(zhí)行ret跳轉(zhuǎn)
  4. 申請(qǐng)資源后立即使用defer關(guān)閉資源是好習(xí)慣

到了這里,關(guān)于golang學(xué)習(xí)筆記(defer基礎(chǔ)知識(shí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Zookeeper學(xué)習(xí)筆記(1)—— 基礎(chǔ)知識(shí)

    Zookeeper學(xué)習(xí)筆記(1)—— 基礎(chǔ)知識(shí)

    Zookeeper 是一個(gè)開(kāi)源的分布式的, 為分布式框架提供協(xié)調(diào)服務(wù) 的 Apache 項(xiàng)目 Zookeeper從設(shè)計(jì)模式角度來(lái)理解:是一個(gè)基于 觀察者模式 設(shè)計(jì)的 分布式服務(wù)管理框架 ,它 負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù) ,然后 接受觀察者的注 冊(cè) ,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就 將負(fù)

    2024年02月05日
    瀏覽(23)
  • (學(xué)習(xí)筆記-IP)IP基礎(chǔ)知識(shí)

    (學(xué)習(xí)筆記-IP)IP基礎(chǔ)知識(shí)

    IP在TCP/IP參考模型中處于第三層,也就是 網(wǎng)絡(luò)層。 網(wǎng)絡(luò)層的主要作用是: 實(shí)現(xiàn)主機(jī)與主機(jī)之間的通信,也叫點(diǎn)對(duì)點(diǎn)的通信。 ?網(wǎng)絡(luò)層與數(shù)據(jù)鏈路層的關(guān)系: MAC的作用是實(shí)現(xiàn) 直連 的兩個(gè)設(shè)備之間通信,而IP負(fù)責(zé) 沒(méi)有直連 的兩個(gè)網(wǎng)絡(luò)之間進(jìn)行通信傳輸 ?因此 計(jì)算機(jī)網(wǎng)絡(luò)中需要

    2024年02月16日
    瀏覽(28)
  • Android ContentProvider基礎(chǔ)知識(shí)學(xué)習(xí)筆記

    1、動(dòng)態(tài)申請(qǐng)權(quán)限 2、讀取手機(jī)聯(lián)系人 3、創(chuàng)建自己的ContentProvider (1) onCreate()。初始化ContentProvider的時(shí)候調(diào)用。通常會(huì)在這里完成對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建和升級(jí)等操作,返回true表示ContentProvider初始化成功,返回false則表示失敗。 (2) query()。從ContentProvider中查詢數(shù)據(jù)。uri參數(shù)用于確定查

    2024年04月10日
    瀏覽(24)
  • 數(shù)電模電基礎(chǔ)知識(shí)學(xué)習(xí)筆記匯總

    數(shù)電模電基礎(chǔ)知識(shí)學(xué)習(xí)筆記匯總

    文章目錄: 數(shù)電和模電的關(guān)系 一:模電學(xué)習(xí)筆記 二:數(shù)電學(xué)習(xí)筆記 三:福利 1.NI Multisim14.0電路仿真軟件的下載安裝 2.進(jìn)制轉(zhuǎn)換 3.電路常用公式 4.好的參考筆記? 4.1 筆記? 3.1.1 模電 3.1.1 數(shù)電 4.2 網(wǎng)站 5.八股文 來(lái)源:一周搞(不)定數(shù)電模電全集,電子基礎(chǔ)知識(shí) 11小時(shí) 模電基

    2024年02月15日
    瀏覽(27)
  • CAN總線學(xué)習(xí)筆記 | CAN基礎(chǔ)知識(shí)介紹

    CAN總線學(xué)習(xí)筆記 | CAN基礎(chǔ)知識(shí)介紹

    1.1 CAN協(xié)議簡(jiǎn)介 CAN 是控制器局域網(wǎng)絡(luò) (Controller Area Network) 的簡(jiǎn)稱,它是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國(guó) BOSCH 公司開(kāi)發(fā)的,并最終成為國(guó)際標(biāo)準(zhǔn)(ISO11519以及ISO11898),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。差異點(diǎn)如下: 1.2 CAN物理層 CAN 通訊不是以時(shí)鐘信號(hào)來(lái)進(jìn)行同步的,它

    2023年04月09日
    瀏覽(25)
  • UE4 地形編輯基礎(chǔ)知識(shí) 學(xué)習(xí)筆記

    UE4 地形編輯基礎(chǔ)知識(shí) 學(xué)習(xí)筆記

    之前自己寫(xiě)過(guò)這樣的功能,今天看到一個(gè)UE現(xiàn)成的 點(diǎn)擊地形,選擇樣條 按住CTRL鍵+點(diǎn)擊屏幕中某一個(gè)點(diǎn)會(huì)在場(chǎng)景內(nèi)生成一個(gè)這樣的圖標(biāo) 再點(diǎn)兩次,會(huì)生成B樣條的綠線條 點(diǎn)擊+號(hào)再選擇一個(gè)模型,會(huì)生成對(duì)應(yīng)的鏈條狀的mesh 拉高最遠(yuǎn)處的一個(gè)圖標(biāo)抬高 如果想地形貼合該mesh,則

    2024年02月11日
    瀏覽(22)
  • Windows Api 學(xué)習(xí)筆記 1——基礎(chǔ)知識(shí)(上)

    Windows Api 學(xué)習(xí)筆記 1——基礎(chǔ)知識(shí)(上)

    推薦閱讀《深入淺出:Windows Api 程序設(shè)計(jì)》?!渡钊霚\出:Windows Api 程序設(shè)計(jì)》是 王端明 先生的著作,是2022年人民郵電出版社出版的圖書(shū)。 Microsoft Windows是美國(guó)微軟公司開(kāi)發(fā)的一套操作系統(tǒng)。自1985年問(wèn)世以來(lái),隨著軟硬件的升級(jí),Microsoft Windows不斷迭代更新,變得更加人性

    2024年02月08日
    瀏覽(28)
  • web滲透安全學(xué)習(xí)筆記:2、HTML基礎(chǔ)知識(shí)

    web滲透安全學(xué)習(xí)筆記:2、HTML基礎(chǔ)知識(shí)

    目錄 前言 HTML的標(biāo)題 段落鏈接與插入圖片 HTML元素 HTML屬性 HTML頭部 HTML與CSS HTML與JavaScript 表格與列表 HTML區(qū)塊 布局 HTML表單 HTML與數(shù)據(jù)庫(kù) 音頻與視頻 HTML事件 運(yùn)行效果: ? ———————————————————————————————————————————? ——

    2024年01月21日
    瀏覽(30)
  • PyTorch學(xué)習(xí)筆記(二):PyTorch簡(jiǎn)介與基礎(chǔ)知識(shí)

    PyTorch學(xué)習(xí)筆記(二):PyTorch簡(jiǎn)介與基礎(chǔ)知識(shí)

    ? ????? 作者簡(jiǎn)介: 大數(shù)據(jù)專業(yè)碩士在讀,CSDN人工智能領(lǐng)域博客專家,阿里云專家博主,專注大數(shù)據(jù)與人工智能知識(shí)分享, 公眾號(hào): GoAI的學(xué)習(xí)小屋,免費(fèi)分享書(shū)籍、簡(jiǎn)歷、導(dǎo)圖等資料,更有交流群分享AI和大數(shù)據(jù),加群方式公眾號(hào)回復(fù)“加群”或??點(diǎn)擊鏈接。 ?? 專欄

    2023年04月09日
    瀏覽(24)
  • 嵌入式學(xué)習(xí)筆記——STM32硬件基礎(chǔ)知識(shí)

    嵌入式學(xué)習(xí)筆記——STM32硬件基礎(chǔ)知識(shí)

    上一篇中我們重點(diǎn)是講了一下怎么搭建開(kāi)發(fā)環(huán)境以及怎么下載燒錄的過(guò)程,這都是解決的電腦端的開(kāi)發(fā)環(huán)境問(wèn)題,還沒(méi)有到實(shí)際的開(kāi)發(fā)板上,我們的單片機(jī)是都是焊接在開(kāi)發(fā)板上的,PCB上有著它所需的工作電路。并不是直接給供電電壓就可以讓其工作的,本文主要是簡(jiǎn)介一下

    2024年01月22日
    瀏覽(101)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包