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

詳解golang?defer?閉包?匿名函數(shù)

 更新時(shí)間:2022年07月14日 09:31:07   作者:@航空母艦  
這篇文章主要介紹了golang?defer?閉包?匿名函數(shù)的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

defer用于資源的釋放,會(huì)在函數(shù)返回之前進(jìn)行調(diào)用。如果有多個(gè)defer表達(dá)式,調(diào)用順序類(lèi)似于棧,越后面的defer表達(dá)式越先被調(diào)用。

defer的觸發(fā)時(shí)機(jī)

  • 包裹著defer語(yǔ)句的函數(shù)返回時(shí)
  • 包裹著defer語(yǔ)句的函數(shù)執(zhí)行到最后時(shí)
  • 當(dāng)前goroutine發(fā)生Panic時(shí)

當(dāng)前goroutine發(fā)生Panic時(shí)

//輸出結(jié)果:return前執(zhí)行defer
func f1() {
	defer fmt.Println("return前執(zhí)行defer")
	return
}
 
//輸出結(jié)果:函數(shù)執(zhí)行
// 函數(shù)執(zhí)行到最后
func f2() {
	defer fmt.Println("函數(shù)執(zhí)行到最后")
	fmt.Println("函數(shù)執(zhí)行")
}
 
//輸出結(jié)果:panic前  第一個(gè)defer在Panic發(fā)生時(shí)執(zhí)行,第二個(gè)defer在Panic之后聲明,不能執(zhí)行到
func f3() {
	defer fmt.Println("panic前")
	panic("panic中")
	defer fmt.Println("panic后")
}

defer,return,返回值的執(zhí)行順序

  • 先給返回值賦值
  • 執(zhí)行defer語(yǔ)句
  • 包裹函數(shù)return返回
func f1() int { //匿名返回值
	var r int = 6
	defer func() {
		r *= 7
	}()
	return r
}
 
func f2() (r int) { //有名返回值
	defer func() {
		r *= 7
	}()
	return 6
}
 
func f3() (r int) { //有名返回值
	defer func(r int) {
		r *= 7
	}(r)
	return 6
}

f1的執(zhí)行結(jié)果是6, f2的執(zhí)行結(jié)果是42,f3的執(zhí)行結(jié)果是6

最后看example3。它改寫(xiě)后變成

func f1() (r int) {
	r = 6 //給返回值賦值
	func(r int) { //這里改的r是傳值傳進(jìn)去的r,不會(huì)改變要返回的那個(gè)r值
		r *= 7
	}(r)
	return //空的return
}

f1的結(jié)果是6。f1是匿名返回值,匿名返回值是在return執(zhí)行時(shí)被聲明,因此defer聲明時(shí),還不能訪(fǎng)問(wèn)到匿名返回值,defer的修改不會(huì)影響到返回值。
f2先給返回值r賦值,r=6,執(zhí)行defer語(yǔ)句,defer修改r, r = 42,然后函數(shù)return。
f3是有名返回值,但是因?yàn)閞是作為defer的傳參,在聲明defer的時(shí)候,就進(jìn)行參數(shù)拷貝傳遞,所以defer只會(huì)對(duì)defer函數(shù)的局部參數(shù)有影響,不會(huì)影響到調(diào)用函數(shù)的返回值。

閉包與匿名函數(shù)

匿名函數(shù):沒(méi)有函數(shù)名的函數(shù)。函數(shù)也是一種類(lèi)型,一個(gè)函數(shù)可以賦值給變量
閉包:可以使用另外一個(gè)函數(shù)作用域中的變量的函數(shù)。閉包復(fù)制的是原對(duì)象指針,這就很容易解釋延遲引用現(xiàn)象。

for i := 0; i <= 3; i++ {
    defer func() {
        fmt.Print(i)
    }
}
//輸出結(jié)果時(shí) 3,3,3,3
因?yàn)閐efer函數(shù)的i是對(duì)for循環(huán)i的引用,defer延遲執(zhí)行,for循環(huán)到最后i是3,到defer執(zhí)行時(shí)i就是3
 
for i := 0; i <= 3; i++ {
    defer func(i int) {
        fmt.Print(i)
    }(i)
}
//輸出結(jié)果時(shí) 3,2,1,0
因?yàn)閐efer函數(shù)的i是在defer聲明的時(shí)候,就當(dāng)作defer參數(shù)傳遞到defer函數(shù)中

匿名函數(shù)

func main() {
	/* 匿名函數(shù)切片初始化 */
	fns := [](func(x int) int){
		func(x int) int { return x + 1 },
		func(x int) int { return x + 113 },
	}
	println(fns[1](100))
 
	/* 結(jié)構(gòu)體初始化 */
	d := struct {
		fn func() string
	}{
		fn: func() string { return "Hello, World!" },
	}
	println(d.fn())
 
	fc := make(chan func() string, 2)
	fc <- func() string { return "Hello, World!" }
	println((<-fc)())
}

閉包

package main
 
import "fmt"
 
func test() func() {
	x := 100
	fmt.Printf("x (%p) = %d\n", &x, x)
 
	return func() {
		fmt.Printf("x (%p) = %d\n", &x, x)
	}
}
 
func main() {
	f := test()
	f()
}

輸出:

x (0xc42007c008) = 100
x (0xc42007c008) = 100

到此這篇關(guān)于golang defer 閉包 匿名函數(shù)的文章就介紹到這了,更多相關(guān)golang defer  匿名函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法

    Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法

    Go鏈接庫(kù)系統(tǒng)的難用可謂是人盡皆知,不同Go版本編譯出來(lái)的不兼容,而且只支持GNU的,不能編譯出Windows上的dll和lib。這篇文章給大家介紹Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法,感興趣的朋友一起看看吧
    2020-05-05
  • Golang中List的實(shí)現(xiàn)方法示例詳解

    Golang中List的實(shí)現(xiàn)方法示例詳解

    最近決定復(fù)習(xí)下Go,所以下面這篇文章主要給大家介紹了關(guān)于Golang中List的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 關(guān)于golang指針的有限操作詳解

    關(guān)于golang指針的有限操作詳解

    傳統(tǒng)意義上來(lái)說(shuō),指針是一個(gè)指向某個(gè)確切的內(nèi)存地址的值,這個(gè)內(nèi)存地址可以是任何數(shù)據(jù)或代碼的起始地址,在Go語(yǔ)言中有幾種東西可以代表"指針",本文給大家介紹的是關(guān)于golang指針的有限操作,感興趣的同學(xué)可以參考一下
    2023-08-08
  • Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法

    Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法

    這篇文章主要介紹了Golang?中如何判斷兩個(gè)結(jié)構(gòu)體相等,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Go語(yǔ)言開(kāi)發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放

    Go語(yǔ)言開(kāi)發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放

    這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Golang 模塊引入及表格讀寫(xiě)業(yè)務(wù)快速實(shí)現(xiàn)示例

    Golang 模塊引入及表格讀寫(xiě)業(yè)務(wù)快速實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Golang模塊引入及表格讀寫(xiě)業(yè)務(wù)的快速實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    這篇文章主要介紹了聊聊golang的defer的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù)

    用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù)

    這篇文章主要介紹了用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • go開(kāi)源項(xiàng)目用戶(hù)名密碼驗(yàn)證的邏輯鬼才寫(xiě)法

    go開(kāi)源項(xiàng)目用戶(hù)名密碼驗(yàn)證的邏輯鬼才寫(xiě)法

    這篇文章主要為大家介紹了go開(kāi)源項(xiàng)目中發(fā)現(xiàn)的一個(gè)邏輯鬼才寫(xiě)法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • go for range坑和閉包坑的分析

    go for range坑和閉包坑的分析

    今天小編就為大家分享一篇關(guān)于go for range坑和閉包坑的分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04

最新評(píng)論