0

0

如何在Golang中使用匿名函数_创建闭包和回调示例

P粉602998670

P粉602998670

发布时间:2026-01-09 14:56:03

|

396人浏览过

|

来源于php中文网

原创

Go中匿名函数通过捕获外部变量形成闭包,变量按需引用并堆上驻留;常用于封装私有状态(如计数器)、作为回调函数(HTTP处理器、异步通知);需警惕循环中直接捕获i导致的共享变量陷阱。

如何在golang中使用匿名函数_创建闭包和回调示例

在 Go 中,匿名函数(也叫函数字面量)可以捕获其定义时所在作用域的变量,从而形成闭包;同时它天然适合作为回调函数传递给其他函数。关键在于理解变量捕获的时机和生命周期。

匿名函数 + 闭包:记住外部变量的状态

闭包的核心是“函数 + 它引用的外部变量环境”。Go 的匿名函数会按需捕获外围变量(不是拷贝,而是引用),只要该函数可能被后续调用,这些变量就会被保留在堆上(即使外层函数已返回)。

常见用法:

  • 封装私有状态,避免全局变量
  • 生成一系列行为相似但参数不同的函数
  • 延迟绑定配置或上下文

示例:计数器工厂

立即学习go语言免费学习笔记(深入)”;

func newCounter() func() int {
  count := 0
  return func() int {
    count++
    return count
  }
}

调用:
c1 := newCounter()
c2 := newCounter()
fmt.Println(c1()) // 1
fmt.Println(c1()) // 2
fmt.Println(c2()) // 1 ← 独立状态

作为回调函数:传给高阶函数或异步操作

Go 标准库和第三方包中大量使用函数类型参数(如 http.HandlerFuncsort.SliceStable 的比较函数、strings.FieldsFunc)。匿名函数让回调逻辑内联、简洁、免去命名开销。

vizcom.ai
vizcom.ai

AI草图渲染工具,快速将手绘草图渲染成精美的图像

下载

示例:HTTP 处理器与定时回调

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

// 定时回调(模拟异步任务完成通知)
doAsyncJob := func(done func(string)) {
  time.Sleep(500 * time.Millisecond)
  done("job completed")
}
doAsyncJob(func(msg string) {
  log.Println("Callback received:", msg)
})

注意变量捕获的陷阱:循环中的 i

在 for 循环中直接用匿名函数捕获循环变量(如 i),容易因变量复用导致所有闭包共享同一个地址——最终都看到循环结束后的值。

错误写法:

for i := 0; i   go func() {
    fmt.Println(i) // 全部输出 3
  }()
}

修复方式(任选其一):

  • 在循环体内用新变量接收:val := i; go func() { fmt.Println(val) }()
  • 将 i 作为参数传入匿名函数:go func(v int) { fmt.Println(v) }(i)

闭包与方法接收者:可绑定到结构体实例

匿名函数还能捕获结构体指针,实现类似“绑定方法”的效果,适合需要轻量级行为定制的场景。

type Logger struct { prefix string }

l := &Logger{prefix: "[INFO]"}
log := func(msg string) {
  fmt.Println(l.prefix, msg)
}
log("startup") // [INFO] startup

此时 log 就是一个绑定了特定 l 实例的闭包,无需每次都传 l

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

23

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号