闭包
首先回忆下学习python时学习闭包记得笔记:
闭包——简单来说就是一个函数内部嵌套另一个函数,内部函数作为返回值,往往内部函数还用到了外部函数的变量,他能创建出一个特殊的对象,这个对象里包括了内部函数的功能,以及外部的变量,这就叫闭包。
闭包可以只传递一部分小数据,以及数据要用的代码,占用空间小。
python简单的实例:
# 实现:y = k*x + b
def test(k, b):
def create_y(x):
print(k * x +b)
return create_y
def main():
test1 = test(1, 2)
test1(0) # 2
test1(1) # 3
test1(2) # 4
if __name__ == '__main__':
main()
go语言中的闭包
go语言中闭包同样指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境
。 一个例子:
func calc(base int) (func(int) int, func(int) int) {
add := func(i int) int {
base += i
return base
}
sub := func(i int) int {
base -= i
return base
}
return add, sub
}
func main() {
f1, f2 := calc(10)
fmt.Println(f1(1), f2(2)) // 11 9
fmt.Println(f1(3), f2(4)) // 12 8
fmt.Println(f1(5), f2(6)) // 13 7
}
f1
、f2
的操作修改的始终是最初传进calc(
)里的10
再来一个例子:
假设有一个接口为f1
,它需要接收func()
类型的参数
而我们原本提供的函数f2
的类型为fun(int int)
,显然直接f1(f2)
是不行的,这时我们可以用闭包。
func f1(f func()) {
fmt.Println("this is f1")
f()
}
func f2(x, y int) {
fmt.Println("this is f2")
fmt.Println(x + y)
}
// 要求f1(f2)
func wrapper(f func(int, int), x, y int) func() {
return func() {
f(x, y)
}
}
func main() {
ret := wrapper(f2, 100, 200)
f1(ret)
}
以上代码输出入下:
this is f1
this is f2
300