6.9 应用闭包:将函数作为返回值
...小于 1 分钟
6.9 应用闭包:将函数作为返回值
func functionReturn() {
p2 := add2()
fmt.Printf("p2(3): %d \n", p2(3))
twoAdder := adder(2)
fmt.Printf("twoAdder(3): %d\n", twoAdder(3))
}
func add2() func(b int) int {
return func(b int) int {
return b + 2
}
}
func adder(a int) func(b int) int {
return func(b int) int {
return a + b
}
}
p2(3): 5
twoAdder(3): 5
func fClosure() {
f := adder2()
fmt.Println(f(1))
fmt.Println(f(10))
fmt.Println(f(100))
}
func adder2() func(int) int {
var x int
return func(delta int) int {
x += delta
return x
}
}
1
11
111
在多次调用中,x
的值是被保留的:
闭包函数保存其中的变量值,无论外部函数是否退出,都能够继续操作外部函数中的局部变量。
var g int
go func(i int) {
s := 0
for j := 0; j < i; j++ {
s += j
}
g = s
}(3)
fmt.Println(g) // 3
协程能够继续操作局部变量g
。
工厂函数
需要创建一系列相似函数时,可以创建一个工厂函数。
func factoryFunc() {
addPng := makeAddSuffix(".png")
addJpg := makeAddSuffix(".jpg")
filename := "hero"
fmt.Println(addPng(filename))
fmt.Println(addJpg(filename))
}
func makeAddSuffix(suffix string) func(name string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
hero.png
hero.jpg
高阶函数
可以返回函数和将函数作为参数的函数,被称作高阶函数。
Powered by Waline v2.15.2