来自python背景,刚开始使用Go,我发现自己在Go中寻找等效的map()和reduce()函数。我没有找到它们,所以重新开始循环。例如,这是我使用的而不是map(),其中mapFunction在别处定义:
data := make([]byte, 1024)
count, err := input.Read(data) // error handling removed from this snippet
for i:=0; i<count; i++ {
data[i] = mapFunction(data[i])
}
这就是我使用的而不是reduce(),其中有2个状态变量,我用它来跟踪CSV中字段的引用,因为代码在切片中的每个项目中移动:
data := make([]byte, 1024)
count, err := input.Read(data) // error handling removed from this snippet
for i:=0; i<count; i++ {
data[i], stateVariable1, stateVariable2 =
reduceFunction(data[i], stateVariable1, stateVariable2)
}
以下是我的问题:
谢谢!
ps - 完整代码在这里:https://github.com/dbro/csvquote/blob/go/csvquote.go
答案 0 :(得分:4)
简而言之:
再长一点。
答案 1 :(得分:0)
Volker给出了一个很好的答案,但它并没有发挥Go的主要优势之一,即它的并发性。通过使用“服务器场”策略,可以并行化映射/减少类型的操作(过早优化)。这涉及将要完成的工作分成发送给单独工作人员(即goroutines)的工作包。 Map / Reduce是执行此操作的通用方法,需要更高阶的函数和不可变的数据结构。
Go足够灵活,即使它不是一种功能语言,也可以进行定制的并行分解。虽然没有不变性,但它允许通过使用复制语义来避免别名,从而消除了在goroutines之间交换值时的竞争条件,这实际上是好的。简单地说:共享时直接使用结构而不是指向结构的指针。 (为了帮助,Go1.1中有一个新的竞赛探测器)。
服务器场模式是实现高并行化效率的好方法,因为它是自平衡的。这与几何分解(即通过聚集区域并将它们分配给处理器来共享数据网格)和算法分解(即,将流水线中的不同阶段分配给不同处理器)形成对比,这两者都遭受潜在的不平衡负载。 Go能够表达这三种。