Go-05-函数、闭包与一等公民
本节目标:掌握 Go 函数的多返回值、可变参数、闭包、defer,理解”函数是一等公民”。
1. 函数基础
1 | // 普通函数 |
2. 函数是一等公民
函数可以赋值给变量、传参、作为返回值、放进 map/struct:
1 | // 函数类型 |
3. 闭包(Closure)
闭包 = 函数 + 其引用的外部变量:
1 | func counter() func() int { |
经典例子:斐波那契生成器:
1 | func fibGen() func() int { |
闭包陷阱:循环变量共享(Go 1.22 之前):
1 | funcs := []func(){} |
4. 可变参数
1 | func sum(nums ...int) int { |
混合参数(固定参数在前,可变参数在后):
1 | func printf(format string, args ...interface{}) { |
5. defer:延迟执行
defer 把函数调用推迟到当前函数返回前执行:
1 | func readFile(path string) error { |
多个 defer:后进先出(LIFO)
1 | func main() { |
defer 经典用法:资源清理
1 | func process() (err error) { |
defer 闭包陷阱:
1 | func main() { |
6. 匿名函数与高阶函数
1 | // 立即执行 |
Map 里的函数(命令模式):
1 | commands := map[string]func(){ |
7. 函数式风格:filter / map / reduce
Go 不像 Python 那样有内建,但用泛型可以自己写:
1 | func Filter[T any](s []T, pred func(T) bool) []T { |
Go 1.23+ 引入了 iter 包,提供 slices.Filter / slices.All 等迭代器函数(更新版本可用)。
8. 方法值 vs 方法表达式
1 | type Point struct{ X, Y int } |
9. 实战:手写一个 map 缓存
1 | type Cache[K comparable, V any] struct { |
小结
| 概念 | 关键点 |
|---|---|
| 多返回值 | (int, error) 是惯用模式 |
| 命名返回值 | 文档化 + defer 里能修改 |
| 一等公民 | 函数可赋值/传参/返回/装容器 |
| 闭包 | 函数 + 引用环境;注意循环变量陷阱 |
| defer | LIFO;用于资源清理;参数在 defer 时就求值 |
| 可变参数 | args ...Type,传切片时用 args... 展开 |
最常用模式:
1 | // 1. 错误返回 |
下一节讲错误处理与 panic/recover,这是 Go 区别于其他语言的关键设计。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/28/Go-05-函数、闭包与一等公民/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!