新聞中心
Go語言支持匿名函數(shù),即在需要使用函數(shù)時再定義函數(shù),匿名函數(shù)沒有函數(shù)名只有函數(shù)體,函數(shù)可以作為一種類型被賦值給函數(shù)類型的變量,匿名函數(shù)也往往以變量方式傳遞,這與C語言的回調(diào)函數(shù)比較類似,不同的是,Go語言支持隨時在代碼里定義匿名函數(shù)。

我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、馬鞍山ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的馬鞍山網(wǎng)站制作公司
匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,下面來具體介紹一下匿名函數(shù)的定義及使用。
定義一個匿名函數(shù)
匿名函數(shù)的定義格式如下:
func(參數(shù)列表)(返回參數(shù)列表){
函數(shù)體
}
匿名函數(shù)的定義就是沒有名字的普通函數(shù)定義。
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ù)
下面的代碼實現(xiàn)對切片的遍歷操作,遍歷中訪問每個元素的操作使用匿名函數(shù)來實現(xiàn),用戶傳入不同的匿名函數(shù)體可以實現(xiàn)對元素不同的遍歷操作,代碼如下:
package main
import (
"fmt"
)
// 遍歷切片的每個元素, 通過給定函數(shù)進行元素訪問
func visit(list []int, f func(int)) {
for _, v := range list {
f(v)
}
}
func main() {
// 使用匿名函數(shù)打印切片內(nèi)容
visit([]int{1, 2, 3, 4}, func(v int) {
fmt.Println(v)
})
}
代碼說明如下:
- 第 8 行,使用 visit() 函數(shù)將整個遍歷過程進行封裝,當要獲取遍歷期間的切片值時,只需要給 visit() 傳入一個回調(diào)參數(shù)即可。
- 第 18 行,準備一個整型切片 []int{1,2,3,4} 傳入 visit() 函數(shù)作為遍歷的數(shù)據(jù)。
- 第 19~20 行,定義了一個匿名函數(shù),作用是將遍歷的每個值打印出來。
匿名函數(shù)作為回調(diào)函數(shù)的設(shè)計在Go語言的系統(tǒng)包中也比較常見,strings 包中就有類似的設(shè)計,代碼如下:
func TrimFunc(s string, f func(rune) bool) string {
return TrimRightFunc(TrimLeftFunc(s, f), f)
}
使用匿名函數(shù)實現(xiàn)操作封裝
下面這段代碼將匿名函數(shù)作為 map 的鍵值,通過命令行參數(shù)動態(tài)調(diào)用匿名函數(shù),代碼如下:
package main
import (
"flag"
"fmt"
)
var skillParam = flag.String("skill", "", "skill to perform")
func main() {
flag.Parse()
var skill = map[string]func(){
"fire": func() {
fmt.Println("chicken fire")
},
"run": func() {
fmt.Println("soldier run")
},
"fly": func() {
fmt.Println("angel fly")
},
}
if f, ok := skill[*skillParam]; ok {
f()
} else {
fmt.Println("skill not found")
}
}
代碼說明如下:
- 第 8 行,定義命令行參數(shù) skill,從命令行輸入 --skill 可以將
=后的字符串傳入 skillParam 指針變量。 - 第 12 行,解析命令行參數(shù),解析完成后,skillParam 指針變量將指向命令行傳入的值。
- 第 14 行,定義一個從字符串映射到 func() 的 map,然后填充這個 map。
- 第 15~23 行,初始化 map 的鍵值對,值為匿名函數(shù)。
- 第 26 行,skillParam 是一個 *string 類型的指針變量,使用 *skillParam 獲取到命令行傳過來的值,并在 map 中查找對應(yīng)命令行參數(shù)指定的字符串的函數(shù)。
- 第 29 行,如果在 map 定義中存在這個參數(shù)就調(diào)用,否則打印“技能沒有找到”。
運行代碼,結(jié)果如下:
PS D:\code> go run main.go --skill=fly angel fly PS D:\code> go run main.go --skill=run soldier run
網(wǎng)頁名稱:創(chuàng)新互聯(lián)GO教程:Go語言匿名函數(shù)——沒有函數(shù)名字的函數(shù)
地址分享:http://fisionsoft.com.cn/article/cojjcdd.html


咨詢
建站咨詢
