匿名函数
1. 赋值给函数变量
package main import "fmt" func main() { sumFun := func(num1, num2 int) int { return num1 + num2 } sum := sumFun(10, 20) fmt.Println(sum) return }
./hello 30
2. 直接执行
package main import "fmt" func main() { func(name string) { fmt.Println("Hello", name) }("TOMOCAT") return }
./hello
Hello TOMOCAT
3. 作为函数参数
可以定义一个接收匿名函数参数的函数,实现回调的效果。
package main import "fmt" /* 求和并调用callback函数对结果进行特殊处理 */ func sumWorker(data []int, callback func(int)) { sum := 0 for _, num := range data { sum += num } callback(sum) } func main() { // 打印出求和结果 sumWorker([]int{1, 2, 3, 4}, func(a int) { fmt.Println("sum:", a) }) // 判断求和结果是否大于100 sumWorker([]int{1, 2, 3, 4}, func(a int) { if a > 100 { fmt.Println("sum > 100") } else { fmt.Println("sum <= 100") } }) }
sum: 10 sum <= 100
闭包
闭包是由函数及其相关引用环境组成的实体,可以理解为一个函数“捕获”了和它处于同一作用域的其他变量。
Golang中所有的匿名函数都是闭包。
4. 总结
- 匿名函数及其“捕获”的*变量被称为闭包
- 被闭包捕获的变量称为“*变量”,在匿名函数实例未消亡时共享同个内存地址
- 同一个匿名函数可以构造多个实例,每个实例内的*变量地址不同
- 匿名函数内部的局部变量在每次执行匿名函数时地址都是变换的
- 通过匿名函数参数赋值的方式可以实现值传递