Go匿名函数及闭包

 

匿名函数

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. 总结

  • 匿名函数及其“捕获”的*变量被称为闭包
  • 被闭包捕获的变量称为“*变量”,在匿名函数实例未消亡时共享同个内存地址
  • 同一个匿名函数可以构造多个实例,每个实例内的*变量地址不同
  • 匿名函数内部的局部变量在每次执行匿名函数时地址都是变换的
  • 通过匿名函数参数赋值的方式可以实现值传递

Go匿名函数及闭包

上一篇:html中iframe根据子页面内容动态修改高度


下一篇:nginx