开发日记003-结构体、集合和高阶函数

  golang支持高阶函数

 

  1. 什么是高阶函数

    

    高阶函数英文叫Higher-order function。那么什么是高阶函数?

JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    

// Process all cars with the given function f:
func (cs Cars) Process(f func(car *Car)) {
    for _, c := range cs {
        f(c)
    }
}

  这里我们抽象了作用于所有车的这种行为,并接收一个作用于每一辆车的f函数作为参数

  接下来我们可以具体定义f  假设我们的需求是根据需要从大集合里面获取子集合,这时我们可以传入一个闭包来获取car的局部切片cars

// Find all cars matching a given criteria.
func (cs Cars) FindAll(f func(car *Car) bool) Cars {

    cars := make([]*Car, 0)
    cs.Process(func(c *Car) {
        if f(c) {
            cars = append(cars, c)
        }
    })
    return cars
}

  //这时传入process的f就是这个闭包(不理解可以暂时可理解成内部匿名函数或者内部匿名类)

(func(c *Car) {
        if f(c) {
            cars = append(cars, c)
        }
    })

  

 

 接下来就是定义if fc的f了

allNewBMWs := allCars.FindAll(func(car *Car) bool {
       return (car.Manufacturer == “BMW”) && (car.BuildYear > 2010)
})

  

 fmt.Println("AllCars: ", allCars)
    fmt.Println("New BMWs: ", allNewBMWs)

  输出结果

AllCars:  [0xf8400038a0 0xf840003bd0 0xf840003ba0 0xf840003b70]
New BMWs:  [0xf840003bd0]

  

posted @ 2021-10-15 10:05  削梨杜月笙  阅读(32)  评论(0)    收藏  举报