Skip to content

1.golang闭包

闭包可以理解成定义在一个函数内部的函数.在本质上,闭包是将函数内部和函数外部连接起来的桥梁。或者说是函数和其引用环境的组合体。

闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境

案例

go
package main

import "fmt"

func add() func(y int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}
func main() {
	f := add()
	r := f(10)
	fmt.Printf("r: %v\n", r)
	r = f(20)
	fmt.Printf("r: %v\n", r)
	r = f(30)
	fmt.Printf("r: %v\n", r)
    fmt.Println("------------------------------------")
	//重新调用之后,重新赋值,跟上面无关
	f1 := add()
	r = f1(100)
	fmt.Printf("r: %v\n", r)
	r = f1(200)
	fmt.Printf("r: %v\n", r)
}
package main

import "fmt"

func add() func(y int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}
func main() {
	f := add()
	r := f(10)
	fmt.Printf("r: %v\n", r)
	r = f(20)
	fmt.Printf("r: %v\n", r)
	r = f(30)
	fmt.Printf("r: %v\n", r)
    fmt.Println("------------------------------------")
	//重新调用之后,重新赋值,跟上面无关
	f1 := add()
	r = f1(100)
	fmt.Printf("r: %v\n", r)
	r = f1(200)
	fmt.Printf("r: %v\n", r)
}

变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。在f的生命周期内,变量x也一直有效

进阶

go

package main

import "fmt"

func add() func(y int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}
func cal(base int) (func(int) int, func(int) int) {
	add := func(a int) int {
		base += a
		return base
	}
	sub := func(a int) int {
		base -= a
		return base
	}
	return add, sub
}

func main() {
	add, sub := cal(100)
	r := add(100)
	fmt.Printf("r: %v\n", r)
	r = sub(50)
	fmt.Printf("r: %v\n", r)
	
}

package main

import "fmt"

func add() func(y int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}
func cal(base int) (func(int) int, func(int) int) {
	add := func(a int) int {
		base += a
		return base
	}
	sub := func(a int) int {
		base -= a
		return base
	}
	return add, sub
}

func main() {
	add, sub := cal(100)
	r := add(100)
	fmt.Printf("r: %v\n", r)
	r = sub(50)
	fmt.Printf("r: %v\n", r)
	
}