顾名思义,匿名函数就是只有函数体没有函数名字的函数!这样,我们就可以随时在需要使用函数时再定义函数,增大了灵活性。通常会以 函数变量 的方式传递。
//定义一个fire()函数
// 将匿名函数体保存到f()中
f := func(data int) {
fmt.Println("hello", data)
}
// 使用f()调用
f(100)
上面是比较普遍的使用方式,当然,匿名函数可以在声明后立即调用:注意下面示例代码中第3行}后的(100),表示对匿名函数进行调用,传递参数为 100。
func(data int) {
fmt.Println("hello", data)
}(100)
匿名函数的使用场景
匿名函数的用途非常广泛,它本身就是一种值,可以方便地保存在各种容器中实现回调函数和操作封装。
实现回调函数:
// 遍历切片的每个元素, 通过给定函数进行元素访问,这个函数参数就是回调参数
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)
})
}
实现操作封装:
//定义命令行参数 skill,从命令行输入 --skill 可以将=后的字符串传入 skillParam 指针变量
var skillParam = flag.String("skill", "", "skill to perform")
func main() {
//解析命令行参数,解析完成后,skillParam 指针变量将指向命令行传入的值
flag.Parse()
//定义字符串映射函数的map
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")
}
}
还有一个重要的应用,那就是闭包!我们将在闭包和递归 一节重点讲解。
变长函数
变长函数就是指参数可变的函数,这并不是一个官方的概念,只是可能会在一些场景下听到这种叫法或称呼,知道即可。可变参数将在 可变参数 详细讲解。
这部分内容就总结到这里,了解了不?