go語言的匿名函數(shù)定義方法是“func(參數(shù)列表)(返回參數(shù)列表){函數(shù)體}”,其實匿名函數(shù)的定義就是沒有名字的普通函數(shù)定義。匿名函數(shù)完全可以當作一個類型,可以直接賦值,可以賦值給變量,可以當作實參或者返回值進行使用,當然也可以直接進行調(diào)用。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
Go語言支持匿名函數(shù),即在需要使用函數(shù)時再定義函數(shù),匿名函數(shù)沒有函數(shù)名只有函數(shù)體,函數(shù)可以作為一種類型被賦值給函數(shù)類型的變量,匿名函數(shù)也往往以變量方式傳遞,這與C語言的回調(diào)函數(shù)比較類似,不同的是,Go語言支持隨時在代碼里定義匿名函數(shù)。
匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,下面來介紹一下匿名函數(shù)的定義方法。
定義一個匿名函數(shù)
匿名函數(shù)的定義格式如下:
func(參數(shù)列表)(返回參數(shù)列表){ 函數(shù)體 }
匿名函數(shù)的定義就是沒有名字的普通函數(shù)定義。
基本使用方法
匿名函數(shù)完全可以當作一個類型,可以直接賦值,可以賦值給變量,可以當作實參或者返回值進行使用,當然也可以直接進行調(diào)用
1) 在定義時調(diào)用匿名函數(shù)
匿名函數(shù)可以在聲明后調(diào)用,例如:
func(data int) { fmt.Println("hello", data) }(100)
注意第3行}后的(100),表示對匿名函數(shù)進行調(diào)用,傳遞參數(shù)為 100。
2) 將匿名函數(shù)賦值給變量
匿名函數(shù)可以被賦值,例如:
// 將匿名函數(shù)體保存到f()中 f := func(data int) { fmt.Println("hello", data) } // 使用f()調(diào)用 f(100)
匿名函數(shù)的用途非常廣泛,它本身就是一種值,可以方便地保存在各種容器中實現(xiàn)回調(diào)函數(shù)和操作封裝。
匿名函數(shù)的使用地方
回調(diào)函數(shù)
為啥要用回調(diào)函數(shù)呢,我們分析一下,A是主函數(shù),B作為參數(shù)傳遞給主函數(shù),我們可以通過上面的例子看到,我們在定義主函數(shù)的時候,只定義了函數(shù)B的參數(shù)以及返回值類型,那么只要函數(shù)B滿足我們定義的類型,函數(shù)A都可以處理,所以說使用回調(diào)函數(shù)可以讓我們主函數(shù)的通用性更強。在通俗點來說,主函數(shù)提供了一個接口,只要符合這個接口規(guī)則的函數(shù)都能用。
type Callback func(a, b int) int // 提供接口,外部隨便怎么搞,只要符合規(guī)則就行 func api(x,y int, callback Callback) int { return callback(x, y) } // 回調(diào)函數(shù),只要滿足傳入?yún)?shù)類型為int // 并且返回值類型也是int就都可以 func add(a, b int) int { return a + b }
閉包
閉包是啥,閉包是由函數(shù)和與其相關的引用環(huán)境組合而成的實體。
func add() func(int) int { var b int return func(a int) int { b = b + a return b } } var f = add()
這里f就是一個閉包,f保存了對b的引用,簡單來說f里面有個指針指向b的地址,所以說我們可以得到以下結果
fmt.Println(f(1)) // 由于b初始化為0,所以輸出1 fmt.Println(f(2)) // 由于上一行代碼已經(jīng)修改了b的值,所以輸出4
所以說閉包就是相當于在我們函數(shù)內(nèi)部使用匿名函數(shù)處理好有關變量的所有事情
【