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

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

新聞中心

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

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)站認(rèn)證、馬鞍山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ù)將整個遍歷過程進行封裝,當(dāng)要獲取遍歷期間的切片值時,只需要給 visit() 傳入一個回調(diào)參數(shù)即可。
  • 第 18 行,準(zhǔn)備一個整型切片 []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 

當(dāng)前名稱:創(chuàng)新互聯(lián)GO教程:Go語言匿名函數(shù)——沒有函數(shù)名字的函數(shù)
網(wǎng)頁鏈接:http://www.5511xx.com/article/cojjcdd.html