Go 实现map_reduce
代码示例
package main
import "fmt"
//实现map reduce
func mapChan(in chan interface{},fn func(interface{}) interface{}) chan interface{}{
out := make(chan interface{})
if in == nil{
close(out)
return in
}
go func() {
defer close(out)
for v := range in{
out <- fn(v)
}
}()
return out
}
func reduce(ch chan interface{},fn func(r,v interface{}) int) interface{} {
if ch == nil{
return nil
}
out := <-ch
for v := range ch{
out = fn(out,v)
}
return out
}
func asStream(done chan interface{}) chan interface{} {
s := make(chan interface{})
values :=[]int{1,2,3,4,5,6,7,8,9}
go func() {
defer close(s)
for _,v := range values{
select {
case <-done:
return
case s<-v:
}
}
}()
return s
}
func main() {
//获取流数据
sm := asStream(nil)
//定义*10 的函数
mapFunc := func(v interface{}) interface{}{
return v.(int)*10
}
// 定义将结果累加的函数
reduceFunc := func(r,v interface{}) int{
return r.(int)+v.(int)
}
out := mapChan(sm,mapFunc)
sum := reduce(out,reduceFunc)
fmt.Println(sum)
}

浙公网安备 33010602011771号