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专题刷题来啦!!!!

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

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


相关文章
|
5月前
|
缓存 Java Serverless
|
9月前
|
Go
golang踩坑 2.goroutine闭包和遍历字符串字符
golang踩坑 2.goroutine闭包和遍历字符串字符
|
存储 缓存 Go
【Golang之路】——匿名函数和闭包
【Golang之路】——匿名函数和闭包
112 0
|
Go
Golang匿名函数与闭包
Golang匿名函数与闭包
63 0
|
1月前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
3月前
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
109 1
|
4天前
|
Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第23天】Go语言的`context`包提供`Context`接口用于处理任务取消、超时和截止日期。通过传递`Context`对象,开发者能轻松实现复杂控制流。本文解析`context`包特性,讨论常见问题和解决方案,并给出代码示例。关键点包括:1) 确保将`Context`传递给所有相关任务;2) 根据需求选择适当的`Context`创建函数;3) 定期检查`Done()`通道以响应取消请求。正确使用`context`包能提升Go程序的控制流管理效率。
13 1
|
4天前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello("Alice")`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
13 1
|
4天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程