1. 简介
当不想给函数命名时,可以使用匿名函数,匿名函数不能独立存在,必须将匿名函数赋值给某个变量,然后通过这个变量调用对应的匿名函数;
示例:
func main() { fpx:= func(x,y int)(z int) { return x+y } fmt.Println(fpx(1,2)) }
输出结果:3
2. 将匿名函数作为返回值
2.1 普通匿名函数
func main() { fpx:=Add2() // 返回 Add2() 中 return 的函数,即 b +2 z := fpx(1) // 将 1 传入函数,即 1 + 2 = 3 fmt.Println(z) } func Add2() func(b int) int { return func(b int) int { return b + 2 } }
2.2 匿名函数引用外部函数变量
引用闭包时,在这个引用的生命周期内,程序会存储闭包中引用的外部函数变量(此时该变量类似于全局变量),直到闭包的生命周期结束。
func main() { // 引用闭包时,在这个引用的生命周期内,程序会存储闭包中引用的外部函数变量(此时该变量类似于全局变量) aa := append("q") fmt.Println(aa("w")) fmt.Println(aa("e")) fmt.Println(aa("r")) } func append(a string) func(b string) string { var s = a return func(b string) string { s = s + b return s } }
输出结果:
2.3 工厂函数
如果需要创建较多功能类似的函数时,可以通过闭包的形式创建一个工厂函数;
示例:创建一个给文件名添加不同后缀的工厂函数
func main() { suffixTxt := makeAppendSuffix("txt") fmt.Println(suffixTxt("a")) fmt.Println(suffixTxt("b")) suffixMp4 := makeAppendSuffix("mp4") fmt.Println(suffixMp4("xx")) fmt.Println(suffixMp4("zz")) } func makeAppendSuffix(suffix string) func(name string) (totalName string) { return func(name string)(totalName string) { return name + "." + suffix } }
输出结果: