golang支援高階函數
- 什麼是高階函數
高階函數英文叫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]