Golang 函数进阶

高阶函数

高阶函数,可以分为两部分:

(1)函数作为参数

func main() {
	// 函数作为参数
	result := calc(10, 20, sum)
	fmt.Println(result)  // 30
}

func calc(x, y int, sum func(int, int) int) int {
	return sum(x, y)
}

func sum(x, y int) int {
	return x + y
}

(2)函数作为返回值

func do(s string) (func(int, int) int, error) {
	switch s {
	case "+":
		return add, nil
	case "-":
		return sub, nil
	default:
		err := errors.New("无法识别的操作符")
		return nil, err
	}
}

匿名函数和闭包

「 匿名函数 」匿名函数,就是没有函数名的函数

func(参数)(返回值){
    函数体
}

因为没有函数名,所以,没办法像普通函数那样调用,So,匿名函数,需要保存到某个变量或者作为立即执行函数

func main() {
	// 将匿名函数保存到变量
	add := func(x, y int) {
		fmt.Println(x + y)
	}
	add(10, 20) // 通过变量调用匿名函数

	//自执行函数:匿名函数定义完加()直接执行
	func(x, y int) {
		fmt.Println(x + y)
	}(10, 20)
}

匿名函数,多用于实现回调函数和闭包


「 闭包 」闭包,是指有权访问另一个函数作用域中的变量的函数,简单来说就是:闭包 = 函数 + 引用环境

  • 创建方法:在一个函数内部创建另一个函数,通过另一个函数,就可以访问这个函数的局部变量
  • 其作用是:是这个函数的局部变量,常驻内存,且不污染全局
// 代码示例 1
func main() {
	// 函数
	f := add()
	fmt.Println(f(100)) // 110
	fmt.Println(f(200)) // 210
}

// 在函数里嵌套另一个函数,返回里面的函数,就形成了闭包
func add() func(int) int {
	x := 10 // 局部变量
	return func(y int) int {
		return x + y
	}
}

// 代码示例 2
func main() {
	// 函数
	f := add(10)
	fmt.Println(f(100)) // 110
	fmt.Println(f(200)) // 310
}

// 在函数里嵌套另一个函数,返回里面的函数,就形成了闭包
func add(x int) func(int) int {
	// 参数 x,等同于声明了一个变量,而,在函数 f 的生命周期中,x 一直有效
	return func(y int) int {  // 函数 f
		x += y
		return x
	}
}