🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 高阶函数应该具备下面至少一个特点: - 将一个或者多个函数作为形参 - 返回一个函数作为其结果 首先明确一点,函数名亦是变量。 ```go func add(n1, n2 int) int { return n1 + n2 } func main() { sum := add(2, 3) fmt.Printf("sum: %v\n", sum) fmt.Printf("add: %v, type: %T\n", add, add) } // 运行结果: // sum: 5 // add: 0x47f620, type: func(int, int) int ``` ## 函数形参 示例: ```go func foo() { fmt.Println("foo函数") } func bar(f func()) { fmt.Printf("f type is: %T\n", f) f() } func main() { bar(foo) } // 运行结果: // f type is: func() // foo函数 ``` bar 函数是高阶函数,foo 函数是普通函数。 **简单应用**:计算foo函数执行时间 ```go func foo() { fmt.Println("foo函数") // 阻塞函数 150 ms time.Sleep(time.Millisecond * 150) } func timer(f func()) { // 获取函数执行前的时间点(毫米级别) startTime := time.Now().UnixMilli() f() // 获取函数执行后的时间点(毫米级别) endTime := time.Now().UnixMilli() fmt.Printf("The time it takes to execute %d ms.\n", endTime-startTime) } func main() { timer(foo) } // 运行结果: // foo函数 // The time it takes to execute 153 ms. ``` timer 函数是高阶函数,foo 函数是普通函数。 ## 函数返回值 返回函数内部的匿名函数 给 调用者函数使用。 ```go func fooReturn() func() { var inner = func() { fmt.Println("fooReturn anonymous function") } return inner } func main() { // 方式一:先接收返回值,然后再执行 f := fooReturn() f() // 方式二:直接调用返回值 fooReturn()() } ``` fooReturn 函数就是高阶函数