🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1.匿名函数 匿名函数就是我们不想给函数起名字的时候就叫匿名函数,函数不能独立存在的 ``` run := func(x, y int) int { return x + y } run(2,3) ``` 可以赋予变量通过变量进行调用,即保存函数的地址到变量中,通过变量进行调用,也可以通过自己调用自己 ``` func(x ,y int) int{ return x+y }(2,3) ``` 下如何将匿名函数赋值给变量并对其进行调用: ``` func main() { f() } func f() { for i := 0; i < 4; i++ { g := func(i int) { fmt.Printf("%d ", i) } g(i) fmt.Printf(" g is of type %T and has value %v\n", g, g) } } ``` 变量 g 代表的是 func(int),变量的值是一个内存地址。所以我们实际上拥有的是一个函数值:匿名函数可以被赋值给变量并作为值使用。 2.闭包函数 应用闭包函数作为函数的返回值 ``` func main() { p2 := Add2() fmt.Println(p2(3)) p3 := Adder(2) fmt.Println(p3(3)) } // 声明一个Add2()函数 此函数的返回值是一个闭包函数 // 函数的参数 返回值都可以函数 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 } } ``` ``` package main import "fmt" type function func(x , y int)interface{} func main() { res := RealFun(1,2,func(x int,y int)interface{}{ return x*y }) fmt.Println(res) } func RealFun(x,y int,op function) interface{} { // if op == nil { return 0 } return op(x,y) } ``` 一个简单的小测试,以下程序会输出什么呢??? ``` func main() { var f = Adder() fmt.Println(f(1)) fmt.Println(f(10)) fmt.Println(f(100)) } func Adder() func(int) int { var x int return func(arg int) int { x += arg return x } } ``` 三次调用函数 f 的过程中函数 Adder() 中变量 arg的值分别为:1、10 和 100。 我们可以看到,在多次调用中,变量 x 的值是被保留的,即 0 + 1 = 1,然后 1 + 10 = 11,最后 11 + 100 = 111:闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。 引出一个概念:什么试高阶函数 1. 高阶函数:可以返回其它函数的函数和接受其它函数作为参数的函数均被称之为高阶函数,是函数式语言的特点。 2. 函数签名表示传入与返回参数的类型与顺序一致 3. 函数是一等公民(头等函数) 4. 闭包函数:闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量