日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go语言中的闭包结构

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言中的闭包结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每次調用 increment都會重新生成一個閉包結構中的變量
內層函數+外層函數局部變量(可以是入參或者定義的局部變量) = 閉包結構

  • 如果將一個內層函數作為函數返回值
  • 內層函數中又涉及到外層函數的局部變量(自己定義或者外部傳進來的參數,都是局部變量)
  • 1+2 條件滿足后,就會導致該局部變量的聲明周期發生改變,外層函數的局部變量不會隨著外層函數的借宿而銷毀
  • 這種內層函數變量和外層局部變量,統稱為閉包結構
  • 閉包結構中,局部變量的聲明周期會發生改變
  • package mainimport "fmt"func main() {// goy語言支持函數式編程:// 支持將一個函數的返回值作為另外一個函數的參數// 也支持將一個函數作為一個函數的返回值/**閉包(closure):*/res1 := increment()fmt.Printf("%T\n", res1)// 局部變量應該銷毀,但是還是能正常返回v1 := res1()fmt.Println(v1)fmt.Println("func closure")v2 := res1()fmt.Println(v2)fmt.Println(res1())fmt.Println(res1())fmt.Println(res1())fmt.Println(res1())// 使用返回函數再次調用// 每當調用 increment的時候fmt.Println("call again")res2 := increment()v3 := res2()fmt.Println(v3) }/* 1. 如果將一個內層函數作為函數返回值 2. 內層函數中又涉及到外層函數的局部變量(自己定義或者外部傳進來的參數,都是局部變量) 3. 1+2 條件滿足后,就會導致該局部變量的聲明周期發生改變,外層函數的局部變量不會隨著外層函數的借宿而銷毀 4. 這種內層函數變量和外層局部變量,統稱為閉包結構 5. 閉包結構中,局部變量的聲明周期會發生改變 */ func increment() func() int { // 外層函數// 定義一個局部變量i := 0// 定義一個匿名函數, 并且進行返回fun := func() int { // 內層函數i++return i}// 返回該匿名函數return fun }

    go中閉包的使用實例:

    package mainimport "fmt"/* 每次調用 increment都會重新生成一個閉包結構中的變量 內層函數+外層函數局部變量(可以是入參或者定義的局部變量) = 閉包結構如果將一個內層函數作為函數返回值 內層函數中又涉及到外層函數的局部變量(自己定義或者外部傳進來的參數,都是局部變量) 1+2 條件滿足后,就會導致該局部變量的聲明周期發生改變,外層函數的局部變量不會隨著外層函數的借宿而銷毀 這種內層函數變量和外層局部變量,統稱為閉包結構 閉包結構中,局部變量的聲明周期會發生改變 */// 老的函數接口,只能接受沒有參數 func oldFun(f func()) {fmt.Println("this is f1")f() }// 新的接口 func newFun(x, y int) {fmt.Println("this is f2")fmt.Print(x+y) }//使用閉包接口可以實現將新接口,轉換為老接口 //使用特性 閉包結構 func closureFun(f func(int, int), x, y int) func() {// 閉包結構中, x y 變量的生命周期已經發生改變,在任何調用匿名函數的地方//都可以得到 x, y 的值,從而實現,在oldFun函數調用匿名函數的時候,壓棧,調到函數newFun的時候,依舊能獲取到 x y的值fmt.Println("closure func")tmp := func() {fmt.Println("closure tmp func")f(x, y)}return tmp }func main() {// 匿名函數,立即執行函數func(x, y int){fmt.Println(x+y)}(1,2)// 閉包fmt.Println("-------------closure func--------------")fakeOldFun := closureFun(newFun, 2,3)oldFun(fakeOldFun)}

    總結

    以上是生活随笔為你收集整理的go语言中的闭包结构的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。