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))
}