轉自https://blog.csdn.net/tbc123tbc/article/details/78948576
這里主要是描述我在學習過程中遇到的困惑。起初把函數單獨寫出來,想用普通函數那種寫好后再去main方法中調用,老是報錯。如下圖:
真正的使用方法,要深刻體會匿名函數的緣由,它只是為了少數的幾次調用,又不想命名太多造成命名沖突,就使用一邊構造函數一邊使用的情況,不能單獨脫離調用來構造。
1-聲明一個匿名函數
func(參數列表) 返回值列表 {
- 1
- 2
}
2-匿名函數的調用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
程序輸出:
- 1
- 2
- 3
- 4
- 5
2.一個綜合性的例子(閉包)——Go的匿名函數是一個閉包
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
程序輸出:
- 1
- 2
- 3
在上面的例子中,變量a指向的閉包函數引用了局部變量i和j,i的值被隔離,在閉包外不能被修改,改變j的值以后,再次調用a,發現結果是修改過的值。
在變量a指向的閉包函數中,只有內部的匿名函數才能訪問變量i,而無法通過其他途徑訪問到,因此保證了i的安全性。
補充說明一下《閉包》的相關知識如下三個方面說:
(1)基本概念
閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變量包含在代碼塊中,所以這些自由變量以及它們引 用的對象沒有被釋放)為自由變量提供綁定的計算環境(作用域)。
(2)閉包的意義
閉包的價值在於可以作為函數對象或者匿名函數,對於類型系統而言,這意味着不僅要表示數據還要表示代碼。支持閉包的多數語言都將函數作為第一級對象,就是說這些函數可以存儲到變量中作為參數傳遞給其他函數,最重要的 是能夠被函數動態創建和返回。
(3)GO語言中使用閉包
Go語言中的閉包同樣也會引用到函數外的變量。閉包的實現確保只要閉包還被使用,那么被閉包引用的變量會一直存在。