GO基礎之閉包

  • 2019 年 11 月 1 日
  • 筆記

一、閉包的理解

閉包是匿名函數與匿名函數所引用環境的組合。匿名函數有動態創建的特性,該特性使得匿名函數不用通過參數傳遞的方式,就可以直接引用外部的變數。

這就類似於常規函數直接使用全局變數一樣,個人理解為:匿名函數和它引用的變數以及環境,類似常規函數引用全局變數處於一個包的環境。

 

 

 

package main    import "fmt"    func main() {      //第一種方式      res := adder()      fmt.Printf("%T n", res)      for i := 0; i < 5; i++ {          fmt.Println("i=", i, "sum=", res(i))      }        res2 := adder2()      fmt.Println("res2=", res2)      fmt.Println("result=", res2())      fmt.Printf("%T n", res2)        //第二種方式 匿名閉包      res3 := func() func() int {          num := 0          return func() int {              num++              return num          }      }()      fmt.Println("res3=", res2)      fmt.Println("result=", res3())  }        //定義一個閉包函數 實現累加器  func adder() func(int) int {      sum := 0      res := func(num int) int {          sum += num          return sum      }      return res  }  //定義一個無參閉包函數 實現累加器  func adder2() func() int {      sum := 0      res := func() int {          sum++          return sum      }      fmt.Println("res=", res)      return res  }

 沒有閉包的時候,函數就是一次性買賣,函數執行完畢後就無法再更改函數中變數的值(應該是記憶體釋放了);有了閉包後函數就成為了一個變數的值,只要變數沒被釋放,函數就會一直處於存活並獨享的狀態,因此可以後期更改函數中變數的值(因為這樣就不會被go給回收記憶體了,會一直快取在那裡)。