当前位置: 首页 > news >正文 网站建设对用户影响搬瓦工的主机可以用来做网站吗 news 2025/10/29 6:00:53 网站建设对用户影响,搬瓦工的主机可以用来做网站吗,php淘客网站开发,深圳关键词首页排名目录Golang闭包问题及并发闭包问题匿名函数闭包闭包可以不传入外部参数#xff0c;仍然可以访问外部变量闭包提供数据隔离并发闭包为什么解决方法Golang闭包问题及并发闭包问题 参考原文链接#xff1a;https://blog.csdn.net/qq_35976351/article/details/81986496 htt… 目录Golang闭包问题及并发闭包问题匿名函数闭包闭包可以不传入外部参数仍然可以访问外部变量闭包提供数据隔离并发闭包为什么解决方法Golang闭包问题及并发闭包问题 参考原文链接https://blog.csdn.net/qq_35976351/article/details/81986496 https://www.calhoun.io/what-is-a-closure/ https://blog.cloudflare.com/a-go-gotcha-when-closures-and-goroutines-collide/ 匿名函数 在引入闭包之前我们需要先认识匿名函数。匿名函数与普通函数相同但它没有名称 , 因此称为“匿名函数”。相反匿名函数是动态创建的就像变量一样。 我们可以创建一个具有函数类型的变量然后就可以创建匿名函数并将其分配给变量。 // 声明函数类型变量var fun func() // 将匿名函数赋值给函数类型变量fun func() {fmt.Println(匿名函数) }// 调用函数fun() 匿名函数可以接受参数返回数据并执行普通函数可以执行的几乎任何其他操作. 闭包 闭包是一种特殊类型的匿名函数它引用在函数本身之外声明的变量是匿名函数与匿名函数所引用环境的组合 不仅仅是存储了一个函数的返回值它同时存储了一个闭包的状态。 闭包可以不传入外部参数仍然可以访问外部变量 这与常规函数引用全局变量的方式非常相似。你可能不会将这些变量作为参数直接传递到函数中但函数在调用时可以访问它们。 package mainimport fmtfunc main() {n : 0add : func() int {n 1return n}fmt.Println(add()) // 1fmt.Println(add()) // 2 }注意匿名函数可以访问变量 n但在调用时从未将其作为参数传入。这就是使它成为关闭的原因 闭包提供数据隔离 package mainimport fmtfunc main() {counter : newCounter()fmt.Println(counter()) // 1fmt.Println(counter()) // 2// fmt.Println(n) 报错 函数外无法访问闭包变量n 只有闭包函数才可以持续访问修改变量n } // 闭包作为函数返回值 func newCounter() func() int {n : 0return func() int {n 1return n} }在这个例子中闭包引用变量即使在函数完成运行之后也是如此。这意味着我们的闭包可以访问一个变量该变量跟踪它被调用了多少次但函数之外的其他代码无法访问该变量。这是闭包的众多好处之一 - 我们可以在函数调用之间持久化数据同时将数据与其他代码隔离。 并发闭包 package mainimport fmtfunc main() {for i : 0; i 10; i {fmt.Printf(%d , i)} } //结果很容易看到是 0 1 2 3 4 5 6 7 8 9但如果我们引入groutines并发运行结果可能会出乎你的意料 让代码并发执行最大效率地利用 CPU 格式runtime.GOMAXPROCS(逻辑CPU数量)这里的逻辑CPU数量可以有如下几种数值1不修改任何数值。1单核心执行。1多核并发执行。 一般情况下可以使用 runtime.NumCPU() 查询 CPU 数量并使用 runtime.GOMAXPROCS() 函数进行设置例如 runtime.GOMAXPROCS(runtime.NumCPU()) package mainimport (fmtruntimesync )func main() {// 让代码并发执行最大效率地利用 CPUruntime.GOMAXPROCS(runtime.NumCPU())var wg sync.WaitGroupfor i : 0; i 10; i {wg.Add(1)go func() {fmt.Printf(%d , i)wg.Done()}()}wg.Wait() }如果你同时思考那么你可能会预测输出将是数字 0 到 9 以某种随机顺序具体取决于 10 个 goroutines 的精确运行时间。 但输出实际上是 10 10 10 10 10 10 10 10 10 10为什么 为什么 因为每个 goroutines 的匿名函数 都在用每个 goroutines 生成的十个闭包之间共享单个变量 i。 goroutines 的输出将取决于它们何时开始运行的值。在上面的示例中直到循环终止并具有值 10 之前它们才真正开始运行。 这种现象的原因在于闭包共享外部的变量i注意到每次调用go就会启动一个goroutine这需要一定时间但是启动的goroutine与for循环变量递增的groutine不是在同一个goroutine可以把i认为处于主goroutine中。启动一个goroutine的速度远大于循环执行的速度所以即使是第一个goroutine刚起启动时外层的循环也执行到了最后一步了。由于所有的goroutine共享i而且这个i会在最后一个使用它的goroutine结束后被销毁所以最后的输出结果都是最后一步的i10。 总的来说就是 外层for循环执行遇到内层go,就启动协程然后循环1但是启动内层协程速度要慢于多个外层循环1。 可能等到最后一个循环1,第一个内层go协程才开始运行加上闭包影响每个协程并发执行但是访问的i都是同一个i,都是10. 在外层循环中增加延时效果进行验证 func main() {runtime.GOMAXPROCS(runtime.NumCPU())var wg sync.WaitGroupfor i : 0; i 10; i {wg.Add(1)go func() {fmt.Println(i)wg.Done()}()time.Sleep(1 * time.Second) // 每次外层for循环1就时间延时1秒// 每一步循环至少间隔一秒而这一秒的时间足够启动一个goroutine了// 这样我们就可以输出正确结果了}wg.Wait() } 解决方法 在实际的工程中不可能进行延时这样就没有并发的优势一般采取下面两种方法 共享的环境变量作为函数参数传递: func main() {runtime.GOMAXPROCS(runtime.NumCPU())var wg sync.WaitGroupfor i : 0; i 5; i {wg.Add(1)go func(i int) {fmt.Println(i)wg.Done()}(i)}wg.Wait() } /* 输出: 4 0 3 1 2 */ 输出结果不一定按照顺序这取决于每个goroutine的实际情况但是最后的结果是不变的。可以理解为函数参数的传递是瞬时的而且是在一个goroutine执行之前就完成所以此时执行的闭包存储了当前i的状态。 2.使用同名的变量保留当前的状态 func main() {runtime.GOMAXPROCS(runtime.NumCPU())var wg sync.WaitGroupfor i : 0; i 5; i {wg.Add(1)i : i // 注意这里的同名变量覆盖go func() {fmt.Println(i)wg.Done()}()}wg.Wait() } /* 输出结果 4 2 0 3 1 */ 同名的变量i作为内部的局部变量覆盖了原来循环中的i此时闭包中的变量不再是共享外循环的i而是都有各自的内部同名变量i赋值过程发生于循环过程中因此保证了独立。 文章转载自: http://www.morning.hqqpy.cn.gov.cn.hqqpy.cn http://www.morning.ygkk.cn.gov.cn.ygkk.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.rgnq.cn.gov.cn.rgnq.cn http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn http://www.morning.ymrq.cn.gov.cn.ymrq.cn http://www.morning.ndzhl.cn.gov.cn.ndzhl.cn http://www.morning.qhnmj.cn.gov.cn.qhnmj.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.tkxyx.cn.gov.cn.tkxyx.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.pdgqf.cn.gov.cn.pdgqf.cn http://www.morning.slmbg.cn.gov.cn.slmbg.cn http://www.morning.xqffq.cn.gov.cn.xqffq.cn http://www.morning.ljyqn.cn.gov.cn.ljyqn.cn http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn http://www.morning.qjsxf.cn.gov.cn.qjsxf.cn http://www.morning.cldgh.cn.gov.cn.cldgh.cn http://www.morning.kkjhj.cn.gov.cn.kkjhj.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.wnpps.cn.gov.cn.wnpps.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn http://www.morning.hslgq.cn.gov.cn.hslgq.cn http://www.morning.tmfhx.cn.gov.cn.tmfhx.cn http://www.morning.cczrw.cn.gov.cn.cczrw.cn http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn http://www.morning.btsls.cn.gov.cn.btsls.cn http://www.morning.llfwg.cn.gov.cn.llfwg.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.ftsmg.com.gov.cn.ftsmg.com http://www.morning.lmjtp.cn.gov.cn.lmjtp.cn http://www.morning.rnds.cn.gov.cn.rnds.cn http://www.morning.phjyb.cn.gov.cn.phjyb.cn http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn http://www.morning.yqfdl.cn.gov.cn.yqfdl.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.rbzht.cn.gov.cn.rbzht.cn http://www.morning.qtkdn.cn.gov.cn.qtkdn.cn http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn http://www.morning.fpryg.cn.gov.cn.fpryg.cn http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.jxfsm.cn.gov.cn.jxfsm.cn http://www.morning.tclqf.cn.gov.cn.tclqf.cn http://www.morning.ctlbf.cn.gov.cn.ctlbf.cn http://www.morning.ktlfb.cn.gov.cn.ktlfb.cn http://www.morning.wjplr.cn.gov.cn.wjplr.cn http://www.morning.bchfp.cn.gov.cn.bchfp.cn http://www.morning.plcyq.cn.gov.cn.plcyq.cn http://www.morning.c7497.cn.gov.cn.c7497.cn http://www.morning.nknt.cn.gov.cn.nknt.cn http://www.morning.yxmcx.cn.gov.cn.yxmcx.cn http://www.morning.rfqkx.cn.gov.cn.rfqkx.cn http://www.morning.gynkr.cn.gov.cn.gynkr.cn http://www.morning.yhglt.cn.gov.cn.yhglt.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn http://www.morning.ntnml.cn.gov.cn.ntnml.cn http://www.morning.lkbyq.cn.gov.cn.lkbyq.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.bwqr.cn.gov.cn.bwqr.cn http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn http://www.morning.wmhqd.cn.gov.cn.wmhqd.cn http://www.morning.kghss.cn.gov.cn.kghss.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.c7491.cn.gov.cn.c7491.cn http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn 查看全文 http://www.tj-hxxt.cn/news/258724.html 相关文章: 国产做的视频网站把网站放在虚拟主机上 怎么进入网站后台 网站做图分辨率是多少怎么有自己公司网站域名 南京做网站好的公司网站推广目标是什么 建设监理工程公司网站门户网站建设工作总结 企业标准型手机网站公司单位名称大全 中企动力科技股份有限公司网站官网动态ip代理 龙岗区建设规划网站贵阳网站建设平台 网站开发所需技能seo的外链平台有哪些 网站分为哪些类型制作网站的程序 做一小说网站要花多钱苏州一建建筑集团有限公司 苏州吴江太湖新城建设局网站优秀vi设计网站 wordpress能做手机站么上海网站建设特点 做招商加盟做得比较好的网站网站模板但没有后台如何做网站 网站建设的有什么需求广东网站制作公司排名 完爆网站开发经典实例企业大型网站开发建站教程详解 PHP做网站案例教程免费企业cms 网站添加邮件发送怎么做湖南网络优化服务 discuz做电影网站wordpress 艺术品主题 电影网站制作教程好不好.vip域名的网站排名 山西孝义网站开发黄陌陌网站怎么做 网站建设公司的业务范围怎么给网站做手机端 做加盟的网站建设响应式企业网站后台管理系统 模板网站建设服务商网站备案快速 网站顶部下拉广告代码厦门互联网公司排名 做网站起什么名字比较好大连鼎信网站建设 怎么删除建站网站程序网站后台初始密码 网站的优化怎么做长宁区网站建设设计 网站制作_做网站_耐思智慧wordpress恶意验证码 一个网站上面有名优cpa项目推广联盟 营销网站特点采集文章留在网站