Go中的閉包


閉包是很多語言必備的功能了,golang也不例外。

先看下面的這個例子:

package main

import "fmt"

func adder() func(int) int {
     sum := 0
     return func(x int) int {
          sum += x
          return sum
     }
}

func main() {
     pos, neg := adder(), adder()
     for i := 0; i < 10; i++ {
          fmt.Println(
               pos(i),
               neg(-2*i),
          )
     }
}

運行返回結果:

0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

這個就是Go中的閉包,一個函數和與其相關的引用環境組合而成的實體。

 

關於閉包的概念《閉包的概念、形式和應用》一文已經說的很清楚了。

 

個人理解: 

其實理解閉包的最方便的方法就是將閉包函數看成一個類,一個閉包函數調用就是實例化一個類。

然后就可以根據類的角度看出哪些是“全局變量”,哪些是“局部變量”了。

比如上例中的adder函數返回func(int) int 的函數

pos和neg分別實例化了兩個“閉包類”,在這個“閉包類”中有個“閉包全局變量”sum。所以這樣就很好理解返回的結果了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM