欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中defer執(zhí)行時(shí)機(jī)的案例分析

 更新時(shí)間:2023年11月10日 09:49:26   作者:追逐夢(mèng)想之路_隨筆  
這篇文章主要來(lái)通過(guò)一些案例和大家一起探討一下golang中defer的執(zhí)行時(shí)機(jī),文中的示例代碼講解詳細(xì),對(duì)我們深入了解golang有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下

示例代碼

package main
import "fmt"

func calcFunc(x int, y int) int {
	return x + y
}

func main() {
	// defer語(yǔ)句的執(zhí)行順序是,從右到左,逆序執(zhí)行
	deferDemo()

	// deferDemo1函數(shù)
	demo1 := deferDemo1()
	fmt.Println(demo1) // 0

	// deferDemo2函數(shù)
	demo2 := deferDemo2()
	fmt.Println(demo2) // 1

	// deferDemo4
	demo4 := deferDemo4()
	fmt.Println(demo4) // 1

	// deferDemo5
	demo5 := deferDemo5()
	fmt.Println(demo5) // 1

	// deferDemo6
	demo6 := deferDemo6()
	fmt.Println(demo6) // 2

	// 難點(diǎn)解析
	/*
		   分析:
			defer注冊(cè)順序:
			1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y)))
			2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
			defer執(zhí)行順序:
			1. fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
			2. fmt.Println("AA", calcFunc(x, calcFunc(x, y)))

	*/
	x := 1
	y := 2
	// 注冊(cè)的時(shí)候 x = 1, y = 2 所以執(zhí)行的時(shí)候x = 1, y = 2
	defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2)  // 結(jié)果是:4
	x = 10
	// 注冊(cè)的時(shí)候x = 10, y = 2 所以執(zhí)行的時(shí)候x = 10, y = 2
	defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結(jié)果是:22
	y = 20

}

分析:

defer語(yǔ)句的執(zhí)行順序是,從右到左,逆序執(zhí)行

執(zhí)行deferDemo()函數(shù)時(shí),會(huì)先執(zhí)行defer語(yǔ)句,再執(zhí)行函數(shù)體,函數(shù)體執(zhí)行完后,再執(zhí)行defer語(yǔ)句

執(zhí)行結(jié)果:

開啟defer
結(jié)束defer
defer語(yǔ)句6
defer語(yǔ)句5
defer語(yǔ)句4
defer語(yǔ)句3
defer語(yǔ)句2
defer語(yǔ)句1

demo:

func deferDemo() {
	fmt.Println("開啟defer")
	defer func() {
		fmt.Println("defer語(yǔ)句1")
	}()
	defer func() {
		fmt.Println("defer語(yǔ)句2")
	}()
	defer func() {
		fmt.Println("defer語(yǔ)句3")
	}()

	defer fmt.Println("defer語(yǔ)句4")
	defer fmt.Println("defer語(yǔ)句5")
	defer fmt.Println("defer語(yǔ)句6")

	fmt.Println("結(jié)束defer")
}

deferDemo1執(zhí)行結(jié)果是 0,延遲執(zhí)行

func deferDemo1() int {
	var a int

	defer func() {
		a++
	}()

	return a
}

deferDemo2執(zhí)行結(jié)果是1:原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return

func deferDemo2() (a int) {
	// 步驟一先賦值
	//a = 0

	// 步驟二再執(zhí)行defer語(yǔ)句
	defer func() {
		a++
	}()

	// 步驟三再執(zhí)行函數(shù)體
	// 返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return
	return a
}

deferDemo3執(zhí)行結(jié)果是1: 原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return

func deferDemo3() (a int) {
	defer func() {
		a++
	}()

	return a
}

deferDemo4

func deferDemo4() int {
	x := 1

	defer func(x int) {
		x++ // 內(nèi)部x和外面x不是同一個(gè)變量
	}(x)

	return x // 1
}

deferDemo5

func deferDemo5() (x int) {
	x = 1

	defer func(x int) {
		x++ // 內(nèi)部x和外面x不是同一個(gè)變量
	}(x)

	return x // 1
}

deferDemo6

func deferDemo6() (x int) {
	x = 1

	defer func() {
		x++
	}()

	return x // 2
}

到此這篇關(guān)于golang中defer執(zhí)行時(shí)機(jī)的案例分析的文章就介紹到這了,更多相關(guān)go defer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言字典(map)用法實(shí)例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】

    Go語(yǔ)言字典(map)用法實(shí)例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】

    這篇文章主要介紹了Go語(yǔ)言字典(map)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Go語(yǔ)言字典的創(chuàng)建、填充、遍歷、查找、修改、刪除等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Go項(xiàng)目實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟功能

    Go項(xiàng)目實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟功能

    無(wú)論是優(yōu)雅關(guān)機(jī)還是優(yōu)雅重啟歸根結(jié)底都是通過(guò)監(jiān)聽特定系統(tǒng)信號(hào),然后執(zhí)行一定的邏輯處理保障當(dāng)前系統(tǒng)正在處理的請(qǐng)求被正常處理后再關(guān)閉當(dāng)前進(jìn)程,這篇文章主要介紹了Go實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟 ,需要的朋友可以參考下
    2022-10-10
  • golang占位符%v、%+v、%#v舉例詳解

    golang占位符%v、%+v、%#v舉例詳解

    這篇文章主要給大家介紹了關(guān)于golang占位符%v、%+v、%#v的相關(guān)資料,Go語(yǔ)言中的占位符通常用于格式化輸出,它們以%開頭,后跟一個(gè)字符,表示要轉(zhuǎn)換的數(shù)據(jù)類型,需要的朋友可以參考下
    2024-05-05
  • Go操作redis與redigo的示例解析

    Go操作redis與redigo的示例解析

    這篇文章主要為大家介紹了Go操作redis與redigo的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go zero微服務(wù)高在請(qǐng)求量下如何優(yōu)化

    go zero微服務(wù)高在請(qǐng)求量下如何優(yōu)化

    這篇文章主要為大家介紹了go zero微服務(wù)高在請(qǐng)求量下的優(yōu)化處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go使用select切換協(xié)程入門詳解

    Go使用select切換協(xié)程入門詳解

    這篇文章主要為大家介紹了Go使用select切換協(xié)程入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù)

    Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù)

    這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù),Golang?程序在運(yùn)行時(shí)加載C動(dòng)態(tài)庫(kù)的技術(shù),跳過(guò)了Golang項(xiàng)目編譯階段需要鏈接C動(dòng)態(tài)庫(kù)的過(guò)程,提高了Golang項(xiàng)目開發(fā)部署的靈活性
    2022-07-07
  • mac下安裝golang框架iris的方法

    mac下安裝golang框架iris的方法

    這篇文章主要介紹了mac下安裝golang框架iris的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • go for range坑和閉包坑的分析

    go for range坑和閉包坑的分析

    今天小編就為大家分享一篇關(guān)于go for range坑和閉包坑的分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化

    詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中是如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06

最新評(píng)論