zhcn 编程语言 Golang Golang 容器 Go语言中的匿名函数——没有函数名的函数

Go语言中的匿名函数——没有函数名的函数

Go语言支持匿名函数。即在需要使用函数的时候定义该函数。匿名函数没有函数名,只有函数体。函数可以作为类型分配给函数类型的变量。匿名函数通常传递为:与 C 中的回调函数不同,Go 支持在代码中随时定义匿名函数。

匿名函数是指不需要定义函数名的实现函数的方法,由没有函数名的函数声明和函数体组成。下面,我们将详细讲解匿名函数的定义和用法。

定义匿名函数

匿名函数的定义格式如下。

func(parameter list)(返回参数列表){
    コード
}

匿名函数定义是没有名称的常规函数​​定义。

1)在定义时调用匿名函数

匿名函数可以在声明后调用。例如:

 func(data int) {
    fmt.Println("こんにちは", data)
}(100) 

请注意第三行}后面的(100) 。这意味着调用匿名函数并将参数传递为 100。

2)将匿名函数赋值给变量

例如,您可以像这样分配一个匿名函数:

 f := func(data int) {
    fmt.Println("hello", data)
}

f(100) 

匿名函数有广泛的用途;它们本身就是一种值类型,可以方便地存储在各种容器中以实现回调函数或封装操作。

匿名函数用作回调函数

下面的代码实现了切片的遍历操作。访问遍历中每个元素的操作是使用匿名函数实现的。用户可以通过不同的匿名函数体来实现对元素的不同遍历操作。代码是:

 package main

import (
    "fmt"
)

// スライスの各要素をループし、指定された関数で要素にアクセスする
func visit(list []int, f func(int)) {

    for _, v := range list {
        f(v)
    }
}

func main() {

    // 無名関数を使用してスライスの内容を印刷する
    visit([]int{1, 2, 3, 4}, func(v int) {
        fmt.Println(v)
    })
} 

代码说明如下:

  • 第8行使用visit()函数封装了整个遍历过程。如果想在遍历过程中检索切片值,只需向visit()传递一个回调参数即可。
  • 第18行准备一个整数切片[]int{1,2,3,4}并将其作为遍历数据传递给visit()函数。
  • 第19-20行定义了一个匿名函数,其功能是打印扫描到的每个值。

将匿名函数作为回调函数的设计在Go语言系统包中也很常见,strings包也有类似的设计。这是代码:

 func TrimFunc(s string, f func(rune) bool) string {
    return TrimRightFunc(TrimLeftFunc(s, f), f)
} 
使用匿名函数封装操作

以下代码使用匿名函数作为映射中的键值,并通过命令行参数动态调用匿名函数。

 package main

import (
    "flag"
    "fmt"
)

var skillParam = flag.String("skill", "", "パフォームするスキル")

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("angle fly")
        },
    }

    if f, ok := skill[*skillParam]; ok {
        f()
    } else {
        fmt.Println("スキルが見つかりません")
    }

} 

代码说明如下:

  • 第8行定义了命令行参数skill,从命令行输入–skill并将=后面的字符串传递给skillParam指针变量。
  • 第12行解析命令行参数。解析完成后,skillParam 指针变量指向命令行上传递的值。
  • 第 14 行定义了从字符串到 func() 的映射并填充该映射。
  • 第 15 至 23 行初始化映射的键值对,其中值是匿名函数。
  • 第 26 行,skillParam 是 *string 类型的指针变量。使用 *skillParam 检索从命令行传递的值,并在映射中搜索与命令行参数中指定的字符串对应的函数。
  • 第29行,如果地图定义有这个参数,就会调用,否则会打印“Skill not find”。

当您运行代码时,结果将是:

 PS D:\code> go run main.go --skill=fly
chicken fly
PS D:\code> go run main.go --skill=run
soldier run 

《Go语言中的匿名函数——没有函数名的函数》浅显易懂的讲解!您必须观看的最佳 2 个视频

【初心者向け】JavaScriptの関数の仕組み・使い方を徹底解説! 関数宣言 / 無名関数 / アロー関数って何?【プログラミング入門】
https://www.youtube.com/watch?v=Uqm642_O52U&pp=ygU6IEdvIOiogOiqnuOBruWMv-WQjemWouaVsCAtIOmWouaVsOWQjeOBruOBquOBhOmWouaVsCZobD1KQQ%3D%3D
#15 初見のGo言語で掲示板を作ってみる シャチョーのコードチャレンジ!
https://www.youtube.com/watch?v=46vDyVUIMvM&pp=ygU6IEdvIOiogOiqnuOBruWMv-WQjemWouaVsCAtIOmWouaVsOWQjeOBruOBquOBhOmWouaVsCZobD1KQQ%3D%3D
Go语言支持匿名函数。即在需要使用函数的时候定义该函数。匿名函数没有函数名,只有函数体。函数可以作为类型分配给函数类型的变量。匿名函数通常传递为:与 C 中的回调函数不同,Go 支持在代码中随时定义匿名函数。

匿名函数是指不需要定义函数名的实现函数的方法,由没有函数名的函数声明和函数体组成。下面,我们将详细讲解匿名函数的定义和用法。

定义匿名函数

匿名函数的定义格式如下。

func(parameter list)(返回参数列表){
    コード
}

匿名函数定义是没有名称的常规函数​​定义。

1)在定义时调用匿名函数

匿名函数可以在声明后调用。例如:

 func(data int) {
    fmt.Println("こんにちは", data)
}(100) 

请注意第三行}后面的(100) 。这意味着调用匿名函数并将参数传递为 100。

2)将匿名函数赋值给变量

例如,您可以像这样分配一个匿名函数:

 f := func(data int) {
    fmt.Println("hello", data)
}

f(100) 

匿名函数有广泛的用途;它们本身就是一种值类型,可以方便地存储在各种容器中以实现回调函数或封装操作。

匿名函数用作回调函数

下面的代码实现了切片的遍历操作。访问遍历中每个元素的操作是使用匿名函数实现的。用户可以通过不同的匿名函数体来实现对元素的不同遍历操作。代码是:

 package main

import (
    "fmt"
)

// スライスの各要素をループし、指定された関数で要素にアクセスする
func visit(list []int, f func(int)) {

    for _, v := range list {
        f(v)
    }
}

func main() {

    // 無名関数を使用してスライスの内容を印刷する
    visit([]int{1, 2, 3, 4}, func(v int) {
        fmt.Println(v)
    })
} 

代码说明如下:

  • 第8行使用visit()函数封装了整个遍历过程。如果想在遍历过程中检索切片值,只需向visit()传递一个回调参数即可。
  • 第18行准备一个整数切片[]int{1,2,3,4}并将其作为遍历数据传递给visit()函数。
  • 第19-20行定义了一个匿名函数,其功能是打印扫描到的每个值。

将匿名函数作为回调函数的设计在Go语言系统包中也很常见,strings包也有类似的设计。这是代码:

 func TrimFunc(s string, f func(rune) bool) string {
    return TrimRightFunc(TrimLeftFunc(s, f), f)
} 
使用匿名函数封装操作

以下代码使用匿名函数作为映射中的键值,并通过命令行参数动态调用匿名函数。

 package main

import (
    "flag"
    "fmt"
)

var skillParam = flag.String("skill", "", "パフォームするスキル")

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("angle fly")
        },
    }

    if f, ok := skill[*skillParam]; ok {
        f()
    } else {
        fmt.Println("スキルが見つかりません")
    }

} 

代码说明如下:

  • 第8行定义了命令行参数skill,从命令行输入–skill并将=后面的字符串传递给skillParam指针变量。
  • 第12行解析命令行参数。解析完成后,skillParam 指针变量指向命令行上传递的值。
  • 第 14 行定义了从字符串到 func() 的映射并填充该映射。
  • 第 15 至 23 行初始化映射的键值对,其中值是匿名函数。
  • 第 26 行,skillParam 是 *string 类型的指针变量。使用 *skillParam 检索从命令行传递的值,并在映射中搜索与命令行参数中指定的字符串对应的函数。
  • 第29行,如果地图定义有这个参数,就会调用,否则会打印“Skill not find”。

当您运行代码时,结果将是:

 PS D:\code> go run main.go --skill=fly
chicken fly
PS D:\code> go run main.go --skill=run
soldier run 

《Go语言中的匿名函数——没有函数名的函数》浅显易懂的讲解!您必须观看的最佳 2 个视频

【初心者向け】JavaScriptの関数の仕組み・使い方を徹底解説! 関数宣言 / 無名関数 / アロー関数って何?【プログラミング入門】
https://www.youtube.com/watch?v=Uqm642_O52U&pp=ygU6IEdvIOiogOiqnuOBruWMv-WQjemWouaVsCAtIOmWouaVsOWQjeOBruOBquOBhOmWouaVsCZobD1KQQ%3D%3D
#15 初見のGo言語で掲示板を作ってみる シャチョーのコードチャレンジ!
https://www.youtube.com/watch?v=46vDyVUIMvM&pp=ygU6IEdvIOiogOiqnuOBruWMv-WQjemWouaVsCAtIOmWouaVsOWQjeOBruOBquOBhOmWouaVsCZobD1KQQ%3D%3D