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)
}