Golang中的闭包 闭包其实可以理解成定义在一个函数内部的函数
。在本质上,闭包是将函数内部和函数外部连接起来的桥梁,或者说是函数和其引用环境的组合体。
闭包指的是一个函数与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境
。
首先我们来看一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package mainimport "fmt" func add () func (y int ) int { var x int return func (y int ) int { x = 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) f1 := add() r = f1(100 ) fmt.Printf("r: %v\n" , r) r = f1(200 ) fmt.Printf("r: %v\n" , r) r = f1(300 ) fmt.Printf("r: %v\n" , r) }
运行结果:
1 2 3 4 5 6 r: 10 r: 30 r: 60 r: 100 r: 300 r: 600
变量f
是一个函数并且它引用了其外部作用域中的x
变量,此时f
就是一个闭包。在f
的生命周期内,变量x也一直有效
闭包的进阶示例1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package mainimport ( "fmt" "strings" ) func makeSuffixFunc (suffix string ) func (string ) string { return func (name string ) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } } func main () { jpgFunc := makeSuffixFunc(".jpg" ) txtFunc := makeSuffixFunc(".txt" ) fmt.Println(jpgFunc("test" )) fmt.Println(txtFunc("test" )) }
运行结果:
闭包进阶示例3: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package mainimport "fmt" func cal (base int ) (func (int ) int , func (int ) int ) { add := func (i int ) int { base = base + i return base } sub := func (i int ) int { base = base - i return base } return add, sub } func main () { f1, f2 := cal(10 ) fmt.Println(f1(1 ), f2(2 )) fmt.Println(f1(3 ), f2(4 )) fmt.Println(f1(5 ), f2(6 )) }
运行结果:
闭包其实不复杂,只要牢记闭包=函数+引用环境