Golang闭包
\(\color{blue}{为什么需要闭包?}\)
本质上来说,闭包可以完成C/C++中函数指针的功能,但是由于其实现方式的区别,闭包的使用也不仅限于此。
\(\color{purple}{函数指针}\)
需求:当输入\(1\)时函数可以计算\(a,b\)算术平均,输入\(2\)时可以计算几何平均
package main
import (
"fmt"
"math"
)
func countAverage(method int8) func(float64, float64) float64 {
if method == 1 {
return func(a float64, b float64) float64 {
return (a + b) / 2
}
} else {
return func(a float64, b float64) float64 {
return math.Sqrt(a * b)
}
}
}
func main() {
var a float64
var b float64
var method int8
_, _ = fmt.Scanf("%f %f %d", &a, &b, &method)
f := countAverage(method)
fmt.Println(f(a, b))
}
\(\color{purple}{函数内的全局变量}\)
\(\color{red}{请不要在意这种尝试用C++表述方式理解Golang的语言表达习惯}\)
需求:制作累加器,每一次都需要在原来的基础上进行加减。
package main
import "fmt"
func adder() func(int) int {
var n int = 0
return func(a int) int {
n += a
return n
}
}
func main() {
f := adder()
fmt.Println(f(1))
fmt.Println(f(2))
}