30.蛤蟆筆記go語言——關於閉包

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

30.蛤蟆筆記go語言——關於閉包

Go的匿名函數是一個閉包.

概念

閉包是可以包含自由(未綁定到特定對象)變數的代碼塊,這些變數不在這個代碼塊內或者任何全域上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變數包含在代碼塊中,所以這些自由變數以及它們引用的對象沒有被釋放)為自由變數提供綁定的計算環境(範圍)。

閉包的價值

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

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

代碼

package main

import (

         "fmt"

)

func main() {

         var jint = 5

         a :=func() func() {

                   vari int = 10

                   returnfunc() {

                            fmt.Printf("i,j: %d, %d\n", i, j)

                   }

         }()

         a()

         j *= 2

         a()

}

執行

         i,j: 10, 5

         i,j: 10, 10

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.