0%

Go回调函数与闭包

  • 高阶函数
  • 回调函数
  • 闭包

    高阶函数

    高阶函数 ( high order function ) 特性:
  • 函数可以作为另一个函数的参数(典型用法是回调函数)
  • 函数可以返回另一个函数,即让另一个函数作为这个函数的返回值(典型用法是闭包)
  • 附带的,函数可以作为一个值赋值给变量

回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"strconv"
)

// 第二个参数为函数 func(x, y int) int
func add(msg string, g func(x, y int) int) string{
return msg + " = " + strconv.Itoa(g(1,2))
}

func main () {

// 定义匿名函数赋值给 f ,将 f 作为参数传递给 add()
f := func (x, y int) int {
return x + y
}

fmt.Println(add("a+b", f))
}

输出:a+b = 3

闭包

简单地说,闭包就是”一个函数+一个作用域环境“组成的特殊函数。这个函数可以访问不是它自己内部的变量,也就是这个变量在其它作用域内,且这个变量是未赋值的,而是等待我们去赋值的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func foo(x int) func(int) int {
g := func(y int) int {
x += y
return x
}
return g
}

func main () {

f := foo(5)

fmt.Println(f(10))
fmt.Println(f(10))
fmt.Println(foo(3)(5))

}

输出: 15 25 8

  • foo(5) 返回了一个函数,赋值给 f
  • f 的每次调用都会改变 foo(5) 中 x 的值 (多个闭包函数共享同一个自由变量 x



参考资料