golang的闭包

复制代码
1.累加器
func
AddUpper() myFun { //闭包:返回的函数与这个函数引用到函数外的变量n形成一个整体,共同生成闭包,反复调用f1函数即AddUpper函数,n只初始化一次,所以返回的值的累加的。 //闭包可以理解成一个类,函数是操作,n是字段。函数和它使用到的n构成闭包。 //匿名函数引用了函数外部的变量n,把这个n叫做自由变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在。 //根据闭包的概念,这个n变量不会被销毁,一直存在,相当于全局变量是常驻内存,但是这个变量又不会污染全局,只是存在在相应的环境f1,f2里。 //即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说:函数 + 引用环境 = 闭包 //同一个函数与不同引用环境f1,f2组合,可以形成不同的实例。 var n int = 10 return func(x int) int { n = n + x return n } } func main() { f1 := AddUpper() f2 := AddUpper() fmt.Println(f1(1)) //11 fmt.Println(f1(2)) //13,累计了上面的f1(1) fmt.Println(f2(1)) //11 fmt.Println(f2(2)) //13,累计了上面的f2(1) }


//2.传入字符串,不以.jpg结尾的使其输出以.jpg结尾,原来以.jpg结尾的原样输出。
//使用闭包,将后缀.jpg只输入一次就保存下来,供后续使用。
package main

import (
"fmt"
"strings"
)

func makeSuffix(suffix string) func(string) string {
//返回的匿名函数和外部变量suffix组成了闭包
return func(s string) string {
res := strings.HasSuffix(s, suffix)
if res != true {
return s + suffix
}
return s

}
}
func main() {
//f1接收的makeSuffix的返回值,即makeSuffix的返回函数func(string) string
//因为要设置变量.jpg为固定变量,而输入变量hello为不定变量,所以用了闭包函数,使.jpg为自由变量不会消失。
//使用闭包,只需要传入一次.jpg,就会将这个值保存下来,后面反复使用
f1 := makeSuffix(".jpg")
//f1("hello")为对makeSuffix的返回函数赋值即为设置func("hello") string
res1 := f1("hello")
res2 := f1("hello.jpg")
fmt.Println(res1)
fmt.Println(res2)
}
复制代码

 

posted @   潇潇暮鱼鱼  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示