Go入门指南系列-XI-XIV-结构体、集合和高阶函数
通常你在应用中定义了一个结构体,那么你也可能需要这个结构体的(指针)对象集合,比如:
1 | type Any interface{} |
然后我们就可以使用高阶函数,实际上也就是把函数作为定义所需方法(其他函数)的参数,例如:
1)定义一个通用的 Process()
函数,它接收一个作用于每一辆 car 的 f 函数作参数:
1 | // Process all cars with the given function f: |
2)在上面的基础上,实现一个查找函数来获取子集合,并在 Process()
中传入一个闭包执行(这样就可以访问局部切片 cars
):
1 | // Find all cars matching a given criteria. |
3)实现对应作用的功效 (Map-functionality),从每个 car
对象当中产出某些东西:
1 | // Process cars and create new data. |
现在我们可以定义下面这样的具体查询:
1 | allNewBMWs := allCars.FindAll(func(car *Car) bool { |
4)我们也可以根据参数返回不同的函数。也许我们想根据不同的厂商添加汽车到不同的集合,但是这(这种映射关系)可能会是会改变的。所以我们可以定义一个函数来产生特定的添加函数和 map
集:
1 | func MakeSortedAppender(manufacturers []string)(func(car *Car),map[string]Cars) { |
现在我们可以用它把汽车分类为独立的集合,像这样:
1 | manufacturers := []string{"Ford", "Aston Martin", "Land Rover", "BMW", "Jaguar"} |
我们让这些代码在下面的程序 cars.go 中执行:
示例 11.18 cars.go:
1 | // cars.go |
输出:
1 | AllCars: [0xf8400038a0 0xf840003bd0 0xf840003ba0 0xf840003b70] |