匿名函数是指不需要定义函数名的实现函数的方法,由没有函数名的函数声明和函数体组成。下面,我们将详细讲解匿名函数的定义和用法。
定义匿名函数
匿名函数的定义格式如下。
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 



![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

