1. 程式人生 > >Go匿名函式和閉包

Go匿名函式和閉包

匿名函式

         匿名函式是指不需要定義函式名的一種函式實現方式。

         在Go語言中,函式可以像普通變數一樣被傳遞或使用,這與C語言的回撥函式比較類似。不同的是,Go語言支援隨時在程式碼裡定義匿名函式。

        匿名函式由一個不帶函式名的函式宣告和函式體組成,如下所示:


       匿名函式可以直接賦值給一個變數或者直接執行:

        

閉包

        Go的匿名函式是一個閉包。

基本概念

閉包是可以包含自由(未繫結到特定物件)變數的程式碼塊,這些變數不在這個程式碼快或者任何全域性上下文中定義,而是在定義程式碼塊的環境中定義。要執行的程式碼塊(由於自由變數包含在程式碼塊中,所以這些自由變數以及它們引用的物件的沒有被釋放)為自由變數提供繫結的計算環境(作用域)。

閉包的價值

  閉包的價值在於可以作為函式物件或者匿名函式,對於型別系統而言,這意味著不僅要表示資料還要表示程式碼。支援閉包的多數語言都將函式作為第一級物件,就是說這些函式可以儲存到變數中作為引數傳遞給其他函式,最重要的是能夠被函式動態建立和返回。

Go語言中的閉包

Go語言中的閉包同樣也會引用到函式外的變數。閉包的實現確保只要閉包還被使用,那麼被閉包引用的變數會一直存在。示例如下:


執行結果是:


     在上面的例子中,變數a指向的閉包函式引用了局部變數i和j,i的值被隔離,在閉包外不能被修改,改變j的值以後,再次呼叫a,發現結果是修改過的值。

         在變數a指向的閉包函式中,只有內部的內部的匿名函式才能訪問變數i,而無法通過其他途徑訪問到,因此保證了i的安全性。