go語(yǔ)言中的閉包
1、什么是閉包
? ? ? ? 閉包是一個(gè)函數(shù)返回另一個(gè)函數(shù)的體現(xiàn),一般以匿名函數(shù)的形式出現(xiàn)在一個(gè)函數(shù)返回值的位置,閉包可以動(dòng)態(tài)靈活的創(chuàng)建以及傳遞。閉包使用函數(shù)的變量會(huì)被保存在內(nèi)存中,內(nèi)存消耗大,使用閉包時(shí)需要注意。
? ? ? ? 比如以下代碼,f1函數(shù)返回的是一個(gè)func(),返回值為int的匿名函數(shù)。此時(shí)該匿名函數(shù)是閉包的體現(xiàn),可以靈活的創(chuàng)建。
? ? ? ? 獲取這樣理解閉包還是不夠清楚,看下面函數(shù)。此時(shí)f2在f1函數(shù)的內(nèi)部,此時(shí)f1的局部變量在f2函數(shù)中是可見的,但是f2中的局部變量在f1中是不可見的。父對(duì)象的所有變量,對(duì)子對(duì)象都是可見的,反之不行。
? ? ? ? f2可以讀取f1中的局部變量,那么只要把f2作為返回值,那么在f1的外部就可以讀取f1的內(nèi)部變量了。
? ? ? ? 以上f2函數(shù),就是閉包,閉包是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),或者理解為定義在一個(gè)函數(shù)內(nèi)部的函數(shù),是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的媒介。
2、閉包的作用
? ? ? ? 讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。
? ? ? ? 為什么呢?原因就在于f1是f2的父函數(shù),而f2被賦給了一個(gè)全局變量,這導(dǎo)致f2始終在內(nèi)存中,而f2的存在依賴于f1,因此f1也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后,被垃圾回收機(jī)制回收。
? ? ? ? 因?yàn)殚]包是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的媒介,當(dāng)使用閉包時(shí),不要輕易改變父函數(shù)私有變量的值,因?yàn)樗接凶兞康闹狄桓淖儯]包以及外部引用閉包的函數(shù)值都可能會(huì)改變。