Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

05 | Go 编程模式:Map-Reduce

你好,我是陈皓,网名左耳朵耗子。
这节课,我们来学习一下函数式编程中非常重要的 Map、Reduce、Filter 这三种操作。这三种操作可以让我们轻松灵活地进行一些数据处理,毕竟,我们的程序大多数情况下都在倒腾数据。尤其是对于一些需要统计的业务场景来说,Map、Reduce、Filter 是非常通用的玩法。
话不多说,我们先来看几个例子。

基本示例

Map 示例

在下面的程序代码中,我写了两个 Map 函数,这两个函数需要两个参数:
一个是字符串数组 [] string,说明需要处理的数据是一个字符串;
另一个是一个函数 func(s string) string 或 func(s string) int。
func MapStrToStr(arr []string, fn func(s string) string) []string {
var newArray = []string{}
for _, it := range arr {
newArray = append(newArray, fn(it))
}
return newArray
}
func MapStrToInt(arr []string, fn func(s string) int) []int {
var newArray = []int{}
for _, it := range arr {
newArray = append(newArray, fn(it))
}
return newArray
}
整个 Map 函数的运行逻辑都很相似,函数体都是在遍历第一个参数的数组,然后,调用第二个参数的函数,把它的值组合成另一个数组返回。
因此,我们就可以这样使用这两个函数:
var list = []string{"Hao", "Chen", "MegaEase"}
x := MapStrToStr(list, func(s string) string {
return strings.ToUpper(s)
})
fmt.Printf("%v\n", x)
//["HAO", "CHEN", "MEGAEASE"]
y := MapStrToInt(list, func(s string) int {
return len(s)
})
fmt.Printf("%v\n", y)
//[3, 4, 8]
可以看到,我们给第一个 MapStrToStr() 传了功能为“转大写”的函数,于是出来的数组就成了全大写的,给MapStrToInt() 传的是计算长度,所以出来的数组是每个字符串的长度。
我们再来看一下 Reduce 和 Filter 的函数是什么样的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Go编程模式中的Map-Reduce,以及其在函数式编程中的重要性。作者首先介绍了Map、Reduce、Filter这三种操作的基本示例,通过示例代码展示了它们的运行逻辑和使用方法。接着,作者提供了一些业务示例,展示了如何利用Map、Reduce、Filter来处理员工信息,统计满足特定条件的员工数量和薪资总和等。此外,文章还介绍了泛型Map-Reduce的实现方式,以及如何通过反射机制实现泛型的Map函数。最后,作者总结了Map-Reduce的重要性,强调了它们在业务逻辑和控制逻辑分离解耦的编程模式中的作用。整体而言,本文深入浅出地介绍了Map-Reduce的概念、应用和实现方式,对于想要了解Go编程模式的读者具有一定的参考价值。文章内容涵盖了泛型Map、Reduce和Filter的健壮版实现,以及作者对于反射机制的性能问题和编程模式选择的个人见解。文章内容丰富,适合对Go编程模式感兴趣的读者阅读。

该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • davix
    我对函数式编程的粗浅认识:map-reduce这种还是配合lazy calculation才有意义。
    2021-05-03
    1
    3
  • neohope
    5. 统计 30 岁以下员工的薪资总和,后面少了两行吧? fmt.Printf("Younger Total Salary: %d\n", younger_pay) //Younger Total Salary: 19000
    2021-03-11
    3
  • 铿然
    抽象了一些公共部分,有点像函数级模板方法,不过如文中所说,按这个例子,如果需要自己实现,可能更多人更倾向直接for循环。
    2023-02-22归属地:贵州
  • Witt
    EmployeeCountIf 使用 if fn(&list[i]) 而不是 if fn(&employee),这个是出于什么目的呢?
    2021-08-16
    1
  • Mew151
    健壮版的 Generic Reduce,传进去的pairFunc函数签名只能是这样的吧: func(e1 Employee, e2 Employee) Employee { ... }
    2021-01-15
    2
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部