go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数相关的知识,希望对你有一定的参考价值。
go语言支持匿名函数,即在需要使用函数时,再定义函数。
1. 匿名函数没有函数名,只有函数体
- 声明匿名函数
func (参数列表) (返回参数列表) {
函数体
}
- 在声明时调用匿名函数
func (data int) {
fmt.Println("hello", data)
}(100) // (100)表示对匿名函数进行调用,向匿名函数传参100
2. go函数可以作为值,保存在变量中。匿名函数经常以变量形式传递
- 匿名函数体可以被赋值到变量
f := func (data int) {
fmt.Println("hello", data)
}
// 使用f()调用
f(100)
匿名函数本身是一种值,可以方便地保存在各种容器中,实现回调和操作封装。
- 匿名函数实现回调、闭包等
package main
import (
"fmt"
)
// 使用visit函数封装切片遍历过程,其中的value作为回调函数f的入参,进行相应操作
func visit(list []int, f func(int)) {
for _, v := range list {
f(v)
}
}
// 切片[]int{1, 2, 3, 4}作为visit函数的入参
func main() {
visit([]int{1, 2, 3, 4}, func(v int) { // 声明匿名函数,作用是打印入参
fmt.Println(v)
})
}
go的strings包中也有回调函数设计
func TriFunc (s string, f func(rune) bool) string {
return TriRightFunc (TrimLeftFunc(s, f), f)
}
- 匿名函数实现操作封装
把匿名函数作为map的值,通过命令行参数动态调用匿名函数。
package main
import (
"flag"
"fmt"
)
// 定义命令行参数--skill,把命令行传入字符串赋给指针变量skillParam
var skillParam = flag.String("skill", "", "skill to perform")
func main() {
flag.Parse() // 解析命令行参数,完成后,指针变量skillParam指向命令行传入的值
var skill = map[string]func(){
"fire": func() { fmt.Println("chicken fire") }, // 匿名函数作为map的值
"run": func() { fmt.Println("soldier run") },
"fly": func() { fmt.Println("angel fly") },
}
if f, ok := skill[*skillParam]; ok { // skillParam是一个*string类型的指针变量,使用*skillParam获取命令行传入参数作为key,从map中取出对应的value,即匿名函数
f() // 调用对应匿名函数
} else {
fmt.Println("skill not found")
}
}
/*
# go run --skill fly
angel fly
*/
以上是关于go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数的主要内容,如果未能解决你的问题,请参考以下文章