亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

示例代碼

package main
import "fmt"

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

func main() {
	// defer語句的執(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

	// 難點解析
	/*
		   分析:
			defer注冊順序:
			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
	// 注冊的時候 x = 1, y = 2 所以執(zhí)行的時候x = 1, y = 2
	defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2)  // 結(jié)果是:4
	x = 10
	// 注冊的時候x = 10, y = 2 所以執(zhí)行的時候x = 10, y = 2
	defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結(jié)果是:22
	y = 20

}

分析:

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

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

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

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

demo:

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

	defer fmt.Println("defer語句4")
	defer fmt.Println("defer語句5")
	defer fmt.Println("defer語句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)操作完成才會執(zhí)行return

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

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

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

deferDemo3執(zhí)行結(jié)果是1: 原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會執(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不是同一個變量
	}(x)

	return x // 1
}

deferDemo5

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

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

	return x // 1
}

deferDemo6

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

	defer func() {
		x++
	}()

	return x // 2
}

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

相關文章

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

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

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

    Go項目實現(xiàn)優(yōu)雅關機與平滑重啟功能

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

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

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

    Go操作redis與redigo的示例解析

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

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

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

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

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

    Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫

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

    mac下安裝golang框架iris的方法

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

    go for range坑和閉包坑的分析

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

    詳解Go如何優(yōu)雅的對時間進行格式化

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

最新評論