当前位置: 首页 > news >正文

Go 中闭包的常见使用场景

在 Go 中,闭包(Closure) 是一个函数值,它引用了其定义时所在作用域中的变量。也就是说,闭包可以访问并修改外部作用域中的变量。

Go 中闭包的常见使用场景

✅ 1. 封装状态(无须结构体)

闭包可以用于封装状态,而无需显式定义结构体。

示例:计数器
func newCounter() func() int {var count intreturn func() int {count++return count}
}counter := newCounter()
fmt.Println(counter()) // 输出 1
fmt.Println(counter()) // 输出 2

闭包捕获了 count 变量,实现了私有状态。


✅ 2. 作为回调函数或事件处理

闭包常用于注册回调函数,特别是在 HTTP 处理、定时器、goroutine 中。

示例:HTTP HandlerFunc
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello from closure!")
})

闭包可以直接访问外部变量,比如数据库连接池、配置等。


✅ 3. 延迟执行 / defer 结合使用

闭包可以在 defer 中保存上下文状态。

示例:
for i := 0; i < 3; i++ {val := igo func() {fmt.Println(val)}()
}

如果不使用闭包传参或捕获局部变量,所有 goroutine 都会打印最后一个 i 的值。通过闭包捕获 val,确保每个 goroutine 拿到的是当前循环的值。


✅ 4. 装饰器模式 / 函数包装

闭包可用于增强函数行为,比如日志、限流、超时控制等。

示例:日志中间件
func withLog(fn func()) func() {return func() {fmt.Println("Before function call")fn()fmt.Println("After function call")}
}f := withLog(func() {fmt.Println("Executing main logic")
})f()

输出:

Before function call
Executing main logic
After function call

✅ 5. 惰性初始化

闭包可以用于实现单例或懒加载逻辑。

示例:
var connectOnce sync.Once
var db *sql.DBfunc GetDB() *sql.DB {connectOnce.Do(func() {var err errordb, err = sql.Open("mysql", "user:pass@/dbname")if err != nil {panic(err)}})return db
}

闭包中初始化数据库连接,只执行一次。


总结:闭包的典型用途

场景描述
状态封装实现类似类的私有状态
回调函数HTTP Handler、事件监听
延迟执行defer + 捕获变量
函数装饰添加日志、限流、权限等
单例与初始化惰性加载资源

在你的例子中,Split使用闭包来捕获 rd 变量,实现了一个线程安全的轮询分发策略,是 Go 中闭包非常典型且实用的一种写法。

相关文章:

  • 鸿蒙OSUniApp开发的商品详情展示页面(鸿蒙系统适配版)#三方框架 #Uniapp
  • 硬盘坏了电脑会出现哪些明显现象?机械和固态可不一样
  • windows、Ubuntu、Debian 添加静态路由
  • AI大模型从0到1记录学习numpy pandas day24
  • LeetCode 2900.最长相邻不相等子序列 I:阅读理解题——O(n)一次遍历(贪心)
  • LeetCode 3337.字符串转换后的长度 II:矩阵快速幂(也没有想象中的那么高级啦)
  • V837s-LAN8720A网口phy芯片调试
  • 协作赋能-1-制造业生产流程重构
  • journal of Electronic Imaging(JEI)投稿咨询
  • Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析
  • 如何安全配置好CDN用于防止DDoS与Web攻击 ?
  • 图形语言中间层:重构 AI 编程的未来之路
  • π0: A Vision-Language-Action Flow Model for General Robot Control
  • 瓶装燃气送气工考试的实操考核内容有哪些?
  • 基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例
  • 周赛好题推荐
  • 各类开发教程资料推荐,Java / python /golang /js等
  • Comparator 比较器
  • QT——概述
  • 前端上传获取excel文件后,如何读取excel文件的内容
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡
  • 中拉互联网发展与合作论坛在西安开幕
  • 上交所五方面落实募资新规:强化关键少数责任和股东权利保障
  • 商务部回应稀土出口管制问题
  • 坚持吃素,是不是就不会得高血脂了?
  • 观察|本轮印巴冲突或促使印度空军寻求更先进战机