天天看點

開發日記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)
        }
    })
      

  

開發日記003-結構體、集合和高階函數

 接下來就是定義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]
      

繼續閱讀