go语言开发基础17 - 之go语言里的闭包函数
闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。 首先我们来看一个例子:
package main
import "fmt"
func adder() func(int) int { // 2.定义一个adder函数,返回值是一个函数
var x int // 3.函数里定义一个int类型的变量, 第一次调用x值为:0。9.第二次调用x值为10
return func(y int) int { // 4.返回一个函数,第一次调用时y值为10.第二次调用y值为20
x += y // 7.第一次调用x+y=10.第二次调用x+y=30
return x // 第一次返回结果为:10。第二次返回结果为:30
}
}
func main() { // 1.程序执行入口
var f = adder() // 5.将adder函数的返回函数赋值给变量f
fmt.Println(f(10)) // 6.第一次调用,结果为:10
fmt.Println(f(20)) //8.第二次调用,在上次调用得到的结果的基础上操作,结果为:30
fmt.Println(f(30)) // 第三次调用,在第二次调用得到结果的基础上操作,结果为:60
}
变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。 在f的生命周期内,变量x也一直有效。 闭包进阶示例1:
func adder2(x int) func(int) int { // 变量赋值给f时x的值为10,第二次调用时x的值为20.
return func(y int) int { // 第一次调用y的值为10。第二次调用y的值为:20
x += y // 第一次调用:x+y=20。第二次调用x+y=40
return x
}
}
func main() {
var f = adder2(10)
fmt.Println(f(10)) //20
fmt.Println(f(20)) //40
fmt.Println(f(30)) //70
}
闭包进阶示例2:
func makeSuffixFunc(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) { // 判断name不是以suffix结尾
return name + suffix // 就执行这里
}
return name
}
}
func main() {
jpgFunc := makeSuffixFunc(".jpg") // .jpg结尾
txtFunc := makeSuffixFunc(".txt") // .txt结尾
fmt.Println(jpgFunc("test")) //结果为:test.jpg
fmt.Println(txtFunc("test")) //结果为:test.txt
}
闭包进阶示例3:
func calc(base int) (func(int) int, func(int) int) { // 2.定义calc函数,返回值是两个匿名函数
add := func(i int) int { // 匿名函数
base += i // 加法运算
return base
}
sub := func(i int) int { // 匿名函数
base -= i // 减法运算
return base
}
return add, sub
}
func main() { // 1.程序执行入口
f1, f2 := calc(10) // 3.将calc函数的返回值赋值给两个变量(f1对应add函数、f2对应sub函数)
fmt.Println(f1(1), f2(2)) //结果为:11 9 (第一次:10+1=11、11-2=9)
fmt.Println(f1(3), f2(4)) //结果为:12 8 (第二次:9+3=12、12-4=8)
fmt.Println(f1(5), f2(6)) //结果为:13 7 (第三次:8+5=13、13-6=7)
}

浙公网安备 33010602011771号