日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言匿名函數(shù)——沒有函數(shù)名字的函數(shù)

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