Golang 匿名函数
优质
小牛编辑
144浏览
2023-12-01
匿名函数也是函数的一种,它的格式和普通函数一模一样,只不过没有名字而已
- 普通函数的函数名称是固定的, 匿名函数的函数名称是系统随机的
匿名函数可以定义在函数外(全局匿名函数),也可以定义在函数内(局部匿名函数),Go语言中的普通函数不能嵌套定义,但是可以通过匿名函数来实现函数的嵌套定义
- 全局匿名函数
package main import "fmt" // 方式一 var a = func() { fmt.Println("hello world1") } // 方式二 var ( b = func() { fmt.Println("hello world2") } ) func main() { a() b() }
一般情况下我们很少使用全局匿名函数,大多数情况都是使用局部匿名函数, 匿名函数可以直接调用、保存到变量、作为参数或者返回值
直接调用
package main import "fmt" func main() { func(s string){ fmt.Println(s) }("hello lnj") }
保存到变量
package main import "fmt" func main() { a := func(s string) { fmt.Println(s) } a("hello lnj") }
作为参数
package main import "fmt" func main() { test(func(s string) { fmt.Println(s) }) } func test(f func(s string)) { f("hello lnj") }
作为返回值
package main import "fmt" func main() { res := test() res(10, 20) } func test() func(int, int) { return func(a int, b int) { fmt.Println(a + b) } }
匿名函数应用场景
- 当某个函数只需要被调用一次时,可以使用匿名函数
- 需要执行一些不确定的操作时,可以使用匿名函数
package main import "fmt" func main() { // 项目经理的一天 work(func() { fmt.Println("组织部门开会") fmt.Println("给部门员工分配今天工作任务") fmt.Println("检查部门员工昨天提交的代码") fmt.Println("... ...") }) // 程序员的一天 work(func() { fmt.Println("参加部门会议") fmt.Println("修改测试提交的BUG") fmt.Println("完成老大今天安排的任务") fmt.Println("... ...") }) } // 假设我们需要编写一个函数,用于描述一个人每天上班都需要干嘛 // 职场中的人每天上班前,上班后要做的事几乎都是相同的, 但是每天上班过程中要做的事确实不确定的 // 所以此时我们可以使用匿名函数来解决, 让上班的人自己觉得自己每天上班需要干什么 func work(custom func()) { // 上班前 fmt.Println("起床") fmt.Println("刷牙") fmt.Println("洗脸") fmt.Println("出门") fmt.Println("上班打卡") fmt.Println("开电脑") // 上班中 custom() // 上班后 fmt.Println("关电脑") fmt.Println("下班打卡") fmt.Println("出门") fmt.Println("到家") fmt.Println("吃饭") fmt.Println("睡觉") }
为了提升代码的可读性,我们还可以将这个大函数拆解为独立的匿名函数
func work(custom func()) { // 这种写法的好处是代码层次清晰,并且如果有一些变量 // 只需要在上班前或上班后使用,还可以将这些变量隔离,不对外界造成污染 // 上班前 func(){ fmt.Println("起床") fmt.Println("刷牙") fmt.Println("洗脸") fmt.Println("出门") fmt.Println("上班打卡") fmt.Println("开电脑") }() // 上班中 custom() // 上班后 func(){ fmt.Println("关电脑") fmt.Println("下班打卡") fmt.Println("出门") fmt.Println("到家") fmt.Println("吃饭") fmt.Println("睡觉") }() }
func work(custom func()) { // 前提条件是这个函数只在work函数中使用, 两者有较强的关联性, 否则建议定义为普通函数 pre := func(){ fmt.Println("起床") fmt.Println("刷牙") fmt.Println("洗脸") fmt.Println("出门") fmt.Println("上班打卡") fmt.Println("开电脑") } latter := func(){ fmt.Println("关电脑") fmt.Println("下班打卡") fmt.Println("出门") fmt.Println("到家") fmt.Println("吃饭") fmt.Println("睡觉") } // 上班前 pre() // 上班中 custom() // 上班后 latter() }