跳到主要内容

高阶函数

一个高阶函数应该具备下面至少一个特点:

  • 将一个或者多个函数作为形参

  • 返回一个函数作为其结果

首先明确一件事情:函数名亦是一个变量

package main

import (
"fmt"
"reflect"
)

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

func main() {
var a = addCal
a(2, 3)

fmt.Println(a)
fmt.Println(addCal)
fmt.Println(reflect.TypeOf(addCal)) // func(int, int) int
}

结论:函数参数是一个变量,所以,函数名当然可以作为一个参数传入函数体,也可以作为一个返回值。

7.1、函数参数

package main

import (
"fmt"
"time"
)

func timer(f func()){
timeBefore := time.Now().Unix()
f()
timeAfter := time.Now().Unix()
fmt.Println("运行时间:", timeAfter - timeBefore)
}

func foo() {
fmt.Println("foo function... start")
time.Sleep(time.Second * 2)
fmt.Println("foo function... end")
}

func bar() {
fmt.Println("bar function... start")
time.Sleep(time.Second * 3)
fmt.Println("bar function... end")
}

func main() {
timer(foo)
timer(bar)
}

注意如果函数参数也有参数该怎么写呢?

package main

import "fmt"

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

func mul(x,y int ) int {
return x*y
}

// 双值计算器
func cal(f func(x,y int) int,x,y int,) int{
return f(x,y)
}

func main() {
ret1 := cal(add,12,3,)
fmt.Println(ret1)

ret2 := cal(mul,12,3,)
fmt.Println(ret2)
}

7.2、函数返回值

package main

import (
"fmt"
)

func foo() func(){
inner := func() {
fmt.Printf("函数inner执行")
}
return inner
}

func main() {
foo()()
}