最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中defer的基本使用教程

 更新時(shí)間:2022年06月29日 12:04:23   作者:Free_YaW  
go語言中defer可以完成延遲功能,當(dāng)前函數(shù)執(zhí)行完成后再執(zhí)行defer的代碼塊,下面這篇文章主要給大家介紹了關(guān)于golang中defer基本使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

第一次看go基礎(chǔ)語法的時(shí)候,用使用到了defer。但是一直不知道它到底是什么,有什么用途。這幾天通過查詢、學(xué)習(xí)。算是對defer有了一點(diǎn)淺顯的認(rèn)識。

1.什么是defer

defer是go中一種延遲調(diào)用機(jī)制,defer后面的函數(shù)只有在當(dāng)前函數(shù)執(zhí)行完畢后才能執(zhí)行,通常用于釋放資源。

2.defer的特點(diǎn)

defer遵循先進(jìn)后出的原則,類似于棧的結(jié)構(gòu)。

補(bǔ)充下:為什么要把defer設(shè)計(jì)成這種機(jī)制?

因?yàn)楹笊暾埖馁Y源和可能對前面申請的資源有依賴。如果先將前面申請的資源釋放掉了。對于后面的資源可能會(huì)造成影響。所以先釋放后申請的資源,再釋放前面申請的資源。

3.defer什么時(shí)間執(zhí)行

前面說到,defer只有在當(dāng)前函數(shù)執(zhí)行完畢后,才會(huì)執(zhí)行。其實(shí)不太準(zhǔn)確。

go中的return語句并不是原子性操作,一般是分為兩步:

  • 將返回值賦值給一個(gè)變量
  • 執(zhí)行RET指令

defer就執(zhí)行在1之后,2之前。

4.defer常見的坑

1.輸出是多少?

	x := 10
	defer func(a int) {
		fmt.Println(a)
	}(x)
	x++

答案:

為什么?

因?yàn)閐efer后面的函數(shù)在入棧的時(shí)候保存的是入棧那一刻的值,而當(dāng)時(shí)x的值是10,所以后期對x修改,并不會(huì)影響棧內(nèi)函數(shù)的值。

2.輸出多少

	x := 10
	defer func(a *int) {
		fmt.Println(*a)
	}(&x)
	x++

答案:

為什么?

這里defer后面函數(shù)入棧的時(shí)候存入的執(zhí)行變量x的指針。所以,后期x值改變的時(shí)候,輸出結(jié)果也會(huì)改變。

3.輸出多少

func test()(x int)  {
	 x = 10
	 defer func() {
	 	x++
	 }()
	 return x
}

答案:

為什么?

之前我們說過,return并不是原子性操作,是通過一個(gè)變量賦值和ret指令來完成的。

而上述例子中,是具名函數(shù)。即返回值帶有名字。這樣我們在執(zhí)行defer的時(shí)候相當(dāng)于修改了返回值的值。所以為11

看到這里,博主想到了閉包。和閉包有沒有關(guān)系呢?

4.輸出什么

func test1() int {
	x := 10
	defer func() {
		x++
	}()
	// ans = x
	// -------- defer x = x+1
	// return x
	return x
}

答案:

為什么?
 

還是return語句的原因,博主已經(jīng)在代碼中給出提示??梢?非具名函數(shù)不會(huì)受到相應(yīng)的影響。

對于defer暫時(shí)理解了這些,下次再見。

總結(jié)

到此這篇關(guān)于golang中defer基本使用的文章就介紹到這了,更多相關(guān)go defer使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang單元測試中的技巧分享

    Golang單元測試中的技巧分享

    這篇文章主要為大家詳細(xì)介紹了Golang進(jìn)行單元測試時(shí)的一些技巧和科技,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • golang如何通過viper讀取config.yaml文件

    golang如何通過viper讀取config.yaml文件

    這篇文章主要介紹了golang通過viper讀取config.yaml文件,圍繞golang讀取config.yaml文件的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • 使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    本文介紹了如何使用Go語言和WebSocket技術(shù)構(gòu)建一個(gè)簡單的多人聊天室系統(tǒng),包括客戶端連接管理、消息廣播和并發(fā)處理,最后,通過編寫main.go、hub.go和client.go等核心代碼模塊,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Go語言的errors包提供了基礎(chǔ)的錯(cuò)誤處理能力,允許通過errors.New創(chuàng)建自定義error對象,error在Go中是一個(gè)接口,通過實(shí)現(xiàn)Error方法來定義錯(cuò)誤文本,對錯(cuò)誤的比較通?;趯ο蟮刂?而非文本內(nèi)容,因此即使兩個(gè)錯(cuò)誤文本相同
    2024-10-10
  • golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作

    golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作

    這篇文章主要介紹了golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言JSON編解碼神器之marshal的運(yùn)用

    Go語言JSON編解碼神器之marshal的運(yùn)用

    這篇文章主要為大家詳細(xì)介紹了Go語言中JSON編解碼神器——marshal的運(yùn)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • GoLang調(diào)用鏈可視化go-callvis使用介紹

    GoLang調(diào)用鏈可視化go-callvis使用介紹

    與鏈路追蹤(Tracing)不同,Tracing關(guān)注復(fù)雜的分布式環(huán)境中各個(gè)服務(wù)節(jié)點(diǎn)間的調(diào)用關(guān)系,主要用于服務(wù)治理。而我們本次探索的代碼調(diào)用鏈路則是代碼方法級別的調(diào)用關(guān)系,主要用于代碼設(shè)計(jì)
    2023-02-02
  • Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解

    Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解

    這篇文章主要為大家介紹了Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語言中的return語句

    go語言中的return語句

    這篇文章主要介紹了go語言中的return語句,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-05-05
  • golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)

    golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)

    這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

广德县| 荃湾区| 丰原市| 独山县| 板桥市| 南溪县| 定远县| 清镇市| 贡山| 镇江市| 武威市| 正蓝旗| 明溪县| 梅河口市| 忻城县| 永顺县| 昂仁县| 白银市| 永善县| 崇左市| 无为县| 瑞丽市| 阳原县| 岳阳县| 寿宁县| 镇江市| 岑巩县| 监利县| 高安市| 平谷区| 荣成市| 宜良县| 秀山| 双流县| 建平县| 阳高县| 泸西县| 固原市| 兴国县| 饶平县| 芷江|