一、匿名函数
匿名函数是没有名称的函数,可以直接定义并使用,也可以赋值给变量或作为参数传递
定义格式
1 | func(参数)(返回值){ |
匿名函数因为没有函数名,所以没办法像普通函数那样调用,所以匿名函数需要保存到某个变量或者作为立即执行函数
1 | package main |
特点
没有函数名,通过 func 关键字直接定义。
可直接调用(自执行),也可作为变量存储或作为参数传递给其他函数。
语法简洁,适合临时使用的简单逻辑。
二、闭包
1、闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。
2、闭包是可以捕获外部作用域变量的匿名函数,即使外部作用域已经结束,闭包仍能访问和修改这些变量
基本示例:
1 | func adder() func(int) int { |
变量 f 是一个函数并且它引用了其外部作用域中的x变量,此时 f 就是一个闭包。 在 f 的生命周期内,变量 x 也一直有效。
进阶示例:
1 | func makeSuffixFunc(suffix string) func(string) string { |
闭包注意事项
1、变量引用而非复制:闭包捕获的是变量的引用,而非值。如果外部变量被修改,闭包中访问的值也会变化
1 | func main() { |
2、循环中的闭包陷阱:在循环中定义闭包时,若直接引用循环变量,可能因变量共享导致意外结果
1 | func main() { |
总结:
匿名函数:无名称的函数,适合临时使用或作为参数传递。
闭包:能捕获外部变量的匿名函数,可延长变量生命周期、保持状态,常用于实现计数器、回调、封装等场景。
核心区别:匿名函数是 “没有名字的函数”,而闭包是 “捕获了外部变量的匿名函数”(闭包是匿名函数的一种特殊形式)。