Golang prides itself on being a simple , pragmatic language and tried to avoid sugar that its creators feel are unnecessary. So lets add some map reduce functions ourselves to see what is involved:
package main
import "fmt"
type MyList []string // a custom type can be a builtin type if you want it to be
func (ml MyList) Filter(f func(string) bool) []string {
na := []string{}
for _, v := range ml {
if add := f(v); add {
na = append(na, v)
}
}
return na
}
func (ml MyList) Reduce(f func(prev, current string, index int) string) []string {
na := []string{}
for i, v := range ml {
if i == 0 {
na = append(na, f("", v, i))
} else {
na = append(na, f(ml[i-1], v, i))
}
}
return na
}
func (ml MyList) Map(f func(val string) *string) []string {
na := []string{}
for _, v := range ml {
mVal := f(v)
if nil != mVal {
na = append(na, *mVal)
}
}
return na
}
//Lets try them out
func main() {
list := MyList{"test", "test2"}
fList := list.Filter(func(v string) bool {
if v == "test" {
return true
}
return false
})
fmt.Println(fList)
rList := list.Reduce(func(prev, current string, index int) string {
return fmt.Sprintf("%s%s:%d", prev, current, index)
})
fmt.Println(rList)
mList := list.Map(func(val string) *string {
val = val + " I WAS MAPPED"
return &val
return nil
})
fmt.Println(mList)
}