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

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

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

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

defer的觸發(fā)時機

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

當前goroutine發(fā)生Panic時

//輸出結(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前  第一個defer在Panic發(fā)生時執(zhí)行,第二個defer在Panic之后聲明,不能執(zhí)行到
func f3() {
	defer fmt.Println("panic前")
	panic("panic中")
	defer fmt.Println("panic后")
}

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

  • 先給返回值賦值
  • 執(zhí)行defer語句
  • 包裹函數(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。它改寫后變成

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

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

閉包與匿名函數(shù)

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

for i := 0; i <= 3; i++ {
    defer func() {
        fmt.Print(i)
    }
}
//輸出結(jié)果時 3,3,3,3
因為defer函數(shù)的i是對for循環(huán)i的引用,defer延遲執(zhí)行,for循環(huán)到最后i是3,到defer執(zhí)行時i就是3
 
for i := 0; i <= 3; i++ {
    defer func(i int) {
        fmt.Print(i)
    }(i)
}
//輸出結(jié)果時 3,2,1,0
因為defer函數(shù)的i是在defer聲明的時候,就當作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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語言調(diào)用c語言的so動態(tài)庫的實現(xiàn)

    go語言調(diào)用c語言的so動態(tài)庫的實現(xiàn)

    在Go語言開發(fā)過程中,有時需要調(diào)用C或C++編寫的so動態(tài)庫,本文介紹了如何在Go語言中調(diào)用so庫的步驟和注意事項,包括環(huán)境準備、編譯生成.so文件、Go文件編寫、以及可能遇到的問題和解決方法,感興趣的可以了解一下
    2024-10-10
  • 如何編寫Go語言中間件的實例教程

    如何編寫Go語言中間件的實例教程

    不知道大家有沒有寫過中間件呢,它是怎么寫的呢?下面這篇文中就來給大家分享一下使用Go,如何編寫中間件,文中通過示例代碼介紹的非常詳細,供大家參考學習,下面隨著小編來一起學習學習吧。
    2018-04-04
  • GoLang strings.Builder底層實現(xiàn)方法詳解

    GoLang strings.Builder底層實現(xiàn)方法詳解

    自從學習go一個月以來,我多少使用了一下strings.Builder,略有心得。你也許知道它,特別是你了解bytes.Buffer的話。所以我在此分享一下我的心得,并希望能對你有所幫助
    2022-10-10
  • Go select 死鎖的一個細節(jié)

    Go select 死鎖的一個細節(jié)

    這篇文章主要給大家分享的是Go select 死鎖的一個細節(jié),文章先是對主題提出問題,然后展開內(nèi)容,感興趣的小伙伴可以借鑒一下,希望對你有所幫助
    2021-10-10
  • gin項目部署到服務(wù)器并后臺啟動的步驟

    gin項目部署到服務(wù)器并后臺啟動的步驟

    本文主要介紹了gin項目部署到服務(wù)器并后臺啟動的步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Go語言基礎(chǔ)模板設(shè)計模式示例詳解

    Go語言基礎(chǔ)模板設(shè)計模式示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)設(shè)計模式之模板模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • 詳解Go語言中數(shù)組,切片和映射的使用

    詳解Go語言中數(shù)組,切片和映射的使用

    Arrays (數(shù)組), Slices (切片) 和 Maps (映射) 是常見的一類數(shù)據(jù)結(jié)構(gòu)。這篇文章將為大家詳細介紹一下Go語言中數(shù)組,切片和映射的使用,感興趣的可以學習一下
    2022-07-07
  • 手把手教你如何在Goland中創(chuàng)建和運行項目

    手把手教你如何在Goland中創(chuàng)建和運行項目

    歡迎來到本指南!我們將手把手地教您在Goland中如何創(chuàng)建、配置并運行項目,通過簡單的步驟,您將迅速上手這款強大的集成開發(fā)環(huán)境(IDE),輕松實現(xiàn)您的編程夢想,讓我們一起開啟這段精彩的旅程吧!
    2024-02-02
  • 如何在Go語言中高效使用Redis的Pipeline

    如何在Go語言中高效使用Redis的Pipeline

    在 Redis 中,Pipeline 就像一條流水線,它允許我們將多個命令一次性發(fā)送到服務(wù)器,下面我們就來看看如何在Go語言中高效使用Redis的Pipeline吧
    2024-11-11
  • Go語言中常用語法編寫與優(yōu)化技巧小結(jié)

    Go語言中常用語法編寫與優(yōu)化技巧小結(jié)

    為了充分利用?Go?的潛力,我們需要了解如何優(yōu)化?Go?程序,本文將介紹一些常見的?Go?語言優(yōu)化技巧,并通過實際例子進行說明,希望對大家有所幫助
    2024-02-02

最新評論