golang中的闭包

简介: golang中的闭包

公众号merlinsea


  • 闭包
  • 闭包是由函数及其引用的环境组合而成的实体(闭包=函数+引用环境)
  • golang中实现闭包如下所示,可以发现AddUpper()方法的返回结果是一个匿名函数,同时这个匿名函数引用了函数AddUpper()中的局部变量n和str,因此匿名函数和局部变量n和str构成了闭包
  • golang可以识别出哪些闭包环境中的变量,针对这些变量会在堆上分配,因此每次n=n+x以后新的n值会长期保存起来,下次再调用f函数的时候,会用新的n和str值。

640.jpg


  • golang中典型的闭包使用举例
  • sort包下的SearchInts()方法


640.png


  • 协程
  • golang中的开启一个协程以后,主线程会继续往下执行,当主线程执行结束的时候,所有由这个主线程开启的协程也会被结束。


640.png



  • goroutine的调度模型 ——MPG模式
  • M:操作系统的主线程(是物理线程)
  • P:协程执行需要的上下文环境
  • G:协程(是一种轻量级线程,即在用户态空间创建,不需要转为内核态)
  • MPG的工作模式
  • 程序可能有多个主线程在执行,如果这些M都挂在多个cpu上执行则是并行,如果是挂在一个cpu上执行则是并发
  • 上下文环境P可以根据实际情况开启一个协程G去工作,如果开启了多个协程G,这些写协程以队列的形式挂在P的上下文环境下
  • 当主线程正在执行的协程G阻塞的时候,go会有一种机制将挂在主线程下等待执行的其他协程分配给其他主线程继续执行。

640.jpg



golang版本永久算法题训练营~~

奔跑的小梁,公众号:梁霖编程工具库
算法训练营golang专题刷题来啦!!!!

鱼皮编程导航的优惠券,扫码即可领取

公众号:梁霖编程工具库
今天我加入鱼皮知识新球了!!


相关文章
|
8月前
|
缓存 Java Serverless
|
12月前
|
Go
golang踩坑 2.goroutine闭包和遍历字符串字符
golang踩坑 2.goroutine闭包和遍历字符串字符
|
存储 缓存 Go
【Golang之路】——匿名函数和闭包
【Golang之路】——匿名函数和闭包
120 0
|
Go
Golang匿名函数与闭包
Golang匿名函数与闭包
68 0
|
2月前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
136 0
|
2月前
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
79 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
2月前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
175 5
|
2月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
72 6
|
2月前
|
负载均衡 算法 Go
Golang深入浅出之-Go语言中的服务注册与发现机制
【5月更文挑战第4天】本文探讨了Go语言中服务注册与发现的关键原理和实践,包括服务注册、心跳机制、一致性问题和负载均衡策略。示例代码演示了使用Consul进行服务注册和客户端发现服务的实现。在实际应用中,需要解决心跳失效、注册信息一致性和服务负载均衡等问题,以确保微服务架构的稳定性和效率。
41 3