Go语言匿名函数无需命名,可立即执行、赋值调用或作为参数传递,支持闭包,适用于一次性逻辑、作用域隔离及高阶函数场景。

Go语言中的匿名函数是定义临时逻辑的简洁方式,无需提前声明函数名,适合一次性使用、闭包场景或作为参数传递。
直接定义并立即执行
匿名函数可以定义后立刻调用,常用于初始化、局部作用域隔离或避免污染命名空间。
- 语法:在函数字面量后加括号
() - 注意:函数字面量需用括号包裹,否则编译报错
示例:
func() { fmt.Println("Hello, world!") }()赋值给变量后多次调用
把匿名函数赋给一个变量(通常是 func 类型),后续可像普通函数一样调用。
立即学习“go语言免费学习笔记(深入)”;
- 变量类型需与函数签名匹配,包括参数和返回值
- 适合封装简单、复用次数少但逻辑稍复杂的操作
示例:
add := func(a, b int) int { return a + b }result := add(3, 5) // result = 8
作为参数传给高阶函数
Go标准库(如 sort.Slice、strings.FieldsFunc)和自定义函数常接受函数类型参数,匿名函数是最自然的传入方式。
- 避免为简单逻辑单独写命名函数,代码更紧凑
- 可捕获外层变量,形成闭包,实现状态感知逻辑
示例(按字符串长度排序):
names := []string{"Alice", "Bob", "Charlie"}sort.Slice(names, func(i, j int) bool {
return len(names[i]) })
利用闭包捕获外部变量
匿名函数能访问并记住其定义时所在作用域的变量,这是实现计数器、配置工厂、延迟计算等模式的关键。
- 捕获的是变量的引用,不是值快照(除非显式复制)
- 多个匿名函数共享同一组外层变量时需注意并发安全
示例(带初始值的累加器):
newCounter := func(start int) func() int {count := start
return func() int {
count++
return count
}
}
counter := newCounter(10)
fmt.Println(counter()) // 11
fmt.Println(counter()) // 12










