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

go語(yǔ)言中的defer關(guān)鍵字

 更新時(shí)間:2022年07月29日 08:51:18   作者:taadis  
這篇文章介紹了go語(yǔ)言中的defer關(guān)鍵字,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我是誰(shuí)

defer - 顧名思義翻譯過(guò)來(lái)叫 延遲, 所以我們通常稱呼 defer func() 這樣 defer 后面緊跟的函數(shù)為 延遲函數(shù).

作者注: 不過(guò)從實(shí)際應(yīng)用來(lái)講, 延遲函數(shù)通常用來(lái)做一些函數(shù)最終返回前的一些收尾工作, 所以稱呼為收尾函數(shù)其實(shí)更貼切.

三圍幾何

defer 有其獨(dú)特的一面, 了解其個(gè)性, 才能更好的下手。

延遲性

顧名思義, 既然叫延遲函數(shù), 那么肯定具備延遲性.

我們來(lái)看看怎么個(gè)延遲法,

defer_defer.go

// defer_defer.go
package main

import (
	"fmt"
)

func main() {
	foo()
}

func foo() {
	fmt.Println(1)
	defer fmt.Println(2)
	fmt.Println(3)
}

// go run defer_defer.go
// 1
// 3
// 2

可以看到 defer 定義的延遲函數(shù)最后才執(zhí)行.

再來(lái)個(gè)例子, 如果一個(gè)函數(shù)內(nèi)出現(xiàn)多個(gè)延遲函數(shù), 延遲函數(shù)的執(zhí)行順序又是怎么樣的呢?

defer_filo.go

// defer_filo.go
package main

import (
	"fmt"
)

func main() {
	foo()
}

func foo() {
	defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
}

// go run defer_filo.go
// 3
// 2
// 1

可以看到先定義的延遲函數(shù)后執(zhí)行, 后定義的延遲函數(shù)先執(zhí)行, 符合棧 (stack) 的先進(jìn)后出 (FILO) 原則.

影響性

直接看代碼,

defer_impact.go

// defer_impact.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println(foo())
}

func foo() (result int) {
	defer func() {
		result++
	}()
	return 0
}

// go run defer_defer.go
// 1

結(jié)果是不是跟想象有點(diǎn)不一樣? 上述 foo() 可以改寫為下:

func foo() (result int) {
	result = 0
	result++
	return
}

go 中的 return 語(yǔ)句不是原子操作.

go 中 return 語(yǔ)句的操作過(guò)程為:

  • 設(shè)置返回值
  • 執(zhí)行延遲函數(shù)
  • 真正 return

所以延遲函數(shù)會(huì)影響主函數(shù)的返回值, 當(dāng)然還要區(qū)分具名返回值/匿名返回值, 后話再說(shuō).

確定性

延遲函數(shù)的參數(shù)值, 在延遲函數(shù)首次出現(xiàn)時(shí)就確定了, 不受后續(xù)操作的影響.

我們來(lái)個(gè)例子:

defer_parameters.go

// defer_parameters.go
package main

import (
	"fmt"
)

func main() {
	foo()
}

func foo() {
	number := 1
	defer fmt.Println(number)
	number = 2
	return
}

// go run defer_parameters.go
// 1

能做啥

  • 打開數(shù)據(jù)鏈接, 要記得關(guān)閉, 可以用 defer
  • 操作完內(nèi)存資源, 要記得釋放, 可以用 defer
  • 想改變主函數(shù)的具名返回值, 可以用 defer - 通常不會(huì)這么干
  • 想奇淫技巧, 可以用 defer - 偶爾 show 偶爾爽, 一直 show 一直爽
  • 想搞事情, 可以用 defer - 請(qǐng)自行確保生命和財(cái)產(chǎn)安全
  • ...

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • Golang開發(fā)命令行之flag包的使用方法

    Golang開發(fā)命令行之flag包的使用方法

    這篇文章主要介紹Golang開發(fā)命令行及flag包的使用方法,日常命令行操作,相對(duì)應(yīng)的眾多命令行工具是提高生產(chǎn)力的必備工具,本文圍繞該內(nèi)容展開話題,需要的朋友可以參考一下
    2021-10-10
  • golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Go語(yǔ)言中切片使用的注意事項(xiàng)小結(jié)

    Go語(yǔ)言中切片使用的注意事項(xiàng)小結(jié)

    切片是引用類型,相信對(duì)大家來(lái)說(shuō)都不陌生,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Go語(yǔ)言中切片使用的一些注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Golang HTML 模板使用指南示例詳解

    Golang HTML 模板使用指南示例詳解

    本文詳細(xì)介紹了Golang HTML模板的使用方法,包括基礎(chǔ)模板、高級(jí)模板、完整應(yīng)用示例、CSS樣式、JavaScript交互等,文章強(qiáng)調(diào)了模板組織、代碼復(fù)用、語(yǔ)義化HTML、響應(yīng)式設(shè)計(jì)、性能優(yōu)化等最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Golang的循環(huán)中break和continue語(yǔ)句的用法講解

    Golang的循環(huán)中break和continue語(yǔ)句的用法講解

    這篇文章主要介紹了Golang的循環(huán)中break和continue語(yǔ)句的用法講解,是Go語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn)

    Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    本文主要介紹了go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • go語(yǔ)言中讀取配置文件的方法總結(jié)

    go語(yǔ)言中讀取配置文件的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了go語(yǔ)言中讀取配置文件的幾個(gè)常見方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考下
    2023-08-08
  • mayfly-go部署和使用詳解

    mayfly-go部署和使用詳解

    這篇文章主要介紹了mayfly-go部署和使用詳解,此處部署基于CentOS7.4部署,結(jié)合實(shí)例代碼圖文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論

乡城县| 阳朔县| 长治市| 龙门县| 康乐县| 东至县| 内江市| 长阳| 龙川县| 道孚县| 山西省| 红桥区| 余干县| 鹿邑县| 阳江市| 罗定市| 许昌县| 当阳市| 抚远县| 秦安县| 错那县| 喀什市| 中宁县| 巧家县| 郎溪县| 隆化县| 中牟县| 灵璧县| 宜州市| 隆化县| 永宁县| 济阳县| 丰台区| 邵东县| 同仁县| 枞阳县| 犍为县| 肃南| 淄博市| 渝北区| 永吉县|