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

我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、馬鞍山ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的馬鞍山網(wǎng)站制作公司
匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實(shí)現(xiàn)方式,由一個(gè)不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,下面來(lái)具體介紹一下匿名函數(shù)的定義及使用。
定義一個(gè)匿名函數(shù)
匿名函數(shù)的定義格式如下:
func(參數(shù)列表)(返回參數(shù)列表){
函數(shù)體
}
匿名函數(shù)的定義就是沒有名字的普通函數(shù)定義。
1) 在定義時(shí)調(diào)用匿名函數(shù)
匿名函數(shù)可以在聲明后調(diào)用,例如:
func(data int) {
fmt.Println("hello", data)
}(100)
注意第3行
}后的
(100),表示對(duì)匿名函數(shù)進(jìn)行調(diào)用,傳遞參數(shù)為 100。
2) 將匿名函數(shù)賦值給變量
匿名函數(shù)可以被賦值,例如:
// 將匿名函數(shù)體保存到f()中
f := func(data int) {
fmt.Println("hello", data)
}
// 使用f()調(diào)用
f(100)
匿名函數(shù)的用途非常廣泛,它本身就是一種值,可以方便地保存在各種容器中實(shí)現(xiàn)回調(diào)函數(shù)和操作封裝。
匿名函數(shù)用作回調(diào)函數(shù)
下面的代碼實(shí)現(xiàn)對(duì)切片的遍歷操作,遍歷中訪問每個(gè)元素的操作使用匿名函數(shù)來(lái)實(shí)現(xiàn),用戶傳入不同的匿名函數(shù)體可以實(shí)現(xiàn)對(duì)元素不同的遍歷操作,代碼如下:
package main
import (
"fmt"
)
// 遍歷切片的每個(gè)元素, 通過給定函數(shù)進(jìn)行元素訪問
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)
})
}
代碼說(shuō)明如下:
- 第 8 行,使用 visit() 函數(shù)將整個(gè)遍歷過程進(jìn)行封裝,當(dāng)要獲取遍歷期間的切片值時(shí),只需要給 visit() 傳入一個(gè)回調(diào)參數(shù)即可。
- 第 18 行,準(zhǔn)備一個(gè)整型切片 []int{1,2,3,4} 傳入 visit() 函數(shù)作為遍歷的數(shù)據(jù)。
- 第 19~20 行,定義了一個(gè)匿名函數(shù),作用是將遍歷的每個(gè)值打印出來(lái)。
匿名函數(shù)作為回調(diào)函數(shù)的設(shè)計(jì)在Go語(yǔ)言的系統(tǒng)包中也比較常見,strings 包中就有類似的設(shè)計(jì),代碼如下:
func TrimFunc(s string, f func(rune) bool) string {
return TrimRightFunc(TrimLeftFunc(s, f), f)
}
使用匿名函數(shù)實(shí)現(xiàn)操作封裝
下面這段代碼將匿名函數(shù)作為 map 的鍵值,通過命令行參數(shù)動(dòng)態(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")
}
}
代碼說(shuō)明如下:
- 第 8 行,定義命令行參數(shù) skill,從命令行輸入 --skill 可以將
=后的字符串傳入 skillParam 指針變量。 - 第 12 行,解析命令行參數(shù),解析完成后,skillParam 指針變量將指向命令行傳入的值。
- 第 14 行,定義一個(gè)從字符串映射到 func() 的 map,然后填充這個(gè) map。
- 第 15~23 行,初始化 map 的鍵值對(duì),值為匿名函數(shù)。
- 第 26 行,skillParam 是一個(gè) *string 類型的指針變量,使用 *skillParam 獲取到命令行傳過來(lái)的值,并在 map 中查找對(duì)應(yīng)命令行參數(shù)指定的字符串的函數(shù)。
- 第 29 行,如果在 map 定義中存在這個(gè)參數(shù)就調(diào)用,否則打印“技能沒有找到”。
運(yùn)行代碼,結(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語(yǔ)言匿名函數(shù)——沒有函數(shù)名字的函數(shù)
URL鏈接:http://www.5511xx.com/article/cojjcdd.html


咨詢
建站咨詢
