6.9 应用闭包:将函数作为返回值

Kesa...小于 1 分钟

6.9 应用闭包:将函数作为返回值

06_9_function_return.go

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

06_9_function_closure.go

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

工厂函数

需要创建一系列相似函数时,可以创建一个工厂函数。

06_9_factory_func.go

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