The Filter function

The first HOF that we exploit is the Filter function:

} else {
cars := LoadCars()

PrintCars("ByMake - Honda", cars.Filter(ByMake("Honda")))

You will see the following output:

ByMake - Honda
-----------------------
car: Honda Accord
car: Honda Accord ES2
car: Honda CR-V

 The Filter function is in the cars.go file. Observe the fn argument. It is passed into the Filter function and later called with a car parameter. If fn(car)--that is, ByMake("Honda")--returns true, then the car is added to the collection:

func (cars Collection) Filter(fn FilterFunc) Collection {
filteredCars := make(Collection, 0)
for _, car := range cars {
if fn(car) {
filteredCars = append(filteredCars, car)
}
}
return filteredCars
}

When we define the Filter function on the cars collection type, it's called a method. A Go method is a function with a special receiver argument. In our Filter function, the cars collection is the receiver. Notice that cars is in the first set of arguments, between the func keyword and the Filter name. Note that cars is a data structure that has a Filter behavior. The Filter method accepts FilterFun as its argument and returns a filtered collection.