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

匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创

Go 支持将函数当作值来使用,也允许定义匿名函数,并通过闭包实现对外部变量的捕获与持续访问。这一特性使函数式编程风格在 Go 中成为可能。


一、什么是匿名函数?

匿名函数是没有名字的函数,可以定义后立即调用,或赋值给变量后使用。

示例 1:定义后立即调用
result := func(a, b int) int {return a + b
}(3, 5)fmt.Println("结果:", result) // 输出:结果:8
示例 2:赋值给变量使用
add := func(x, y int) int {return x + y
}fmt.Println(add(10, 20)) // 输出:30

二、什么是闭包?

闭包是一个函数值,它“捕获”并“记住”了其外部作用域的变量,即使外部函数已经执行完毕,这些变量依然存在。

示例:返回一个累加器
func counter() func() int {i := 0return func() int {i++return i}
}c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3

虽然 counter() 函数早已返回结束,但内部变量 i 依然“活着”,被返回的函数持续访问并修改。


三、闭包的常见应用场景

1. 状态保存器
func makeSuffix(suffix string) func(string) string {return func(name string) string {if !strings.HasSuffix(name, suffix) {return name + suffix}return name}
}addTxt := makeSuffix(".txt")
fmt.Println(addTxt("file"))  // 输出:file.txt
fmt.Println(addTxt("log.txt")) // 输出:log.txt
2. 工厂函数生成器

可以生成具有自定义行为的函数,非常适合用于函数式编程。


四、闭包对并发的影响

闭包在与 goroutine 配合使用时需注意变量捕获问题:

for i := 0; i < 3; i++ {go func() {fmt.Println(i)}()
}

输出可能为 3 3 3,因为所有闭包共享同一个 i

✅ 正确方式:

for i := 0; i < 3; i++ {i := i // 创建新的 igo func() {fmt.Println(i)}()
}

五、小结

概念特点说明
匿名函数没有名字,可赋值变量或立即调用
闭包捕获其外部变量并持续访问
应用状态保持器、工厂函数、自定义行为函数等
并发注意闭包变量捕获共享问题,需谨慎使用

匿名函数和闭包让 Go 拥有更高阶的抽象能力,是构建灵活、高效逻辑的利器。

http://www.dtcms.com/a/196837.html

相关文章:

  • 第6章:文件权限
  • 【降维】PCA
  • Captiks无线惯性动捕及步态分析系统:高频采样+400g超宽动态量程,赋能医疗康复、竞技体育、工业检测三大领域,运动轨迹零盲区追踪!”
  • 如何利用Redis实现延迟队列?
  • Windows系统部署MongoDB数据库图文教程
  • String的一些固定程序函数
  • Cadence Allegro安装教程及指导
  • vector(c++)
  • img.dims() <= 2 in function ‘cv::matchTemplate报错
  • OpenAI新发布Codex的全面解析
  • OpenCV 光流估计:从原理到实战
  • JS逆向-某易云音乐下载器
  • OpenCL C++ 常见属性与函数
  • VASP+机器学习快速收敛AIMD
  • 慢速降落字母html
  • 微机电子拉伸试验机
  • 内容安全:使用开源框架Caffe实现上传图片进行敏感内容识别
  • 环形缓冲区 ring buffer 概述
  • 自定义库模块增加自定义许可操作详细方法
  • 通义千问-langchain使用构建(三)
  • 毛泽东(井冈山)词三篇
  • Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)
  • SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)
  • 如何在 Windows 10 或 11 中安装 PowerShellGet 模块?
  • Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
  • SpringSecurity授权、认证
  • python如何做数据预处理
  • matlab求矩阵的逆、行列式、秩、转置
  • 编程基础:什么是变量
  • 【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)