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)
}

  

posted @ 2021-01-22 12:49  pebblecome  阅读(332)  评论(0)    收藏  举报