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