[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 函数就是高阶函数
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra