范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

golang2021数据格式(70)基于管道技术实现函数的流式调用

  管道(Pipeline)这一术语来源是 Unix 的 Shell 命令行,我们可以使用管道连接符 | 通过组合简单的命令实现强大的功能,比如我们想要从系统进程列表中筛选出 nginx 进程,可以这么做:
  ps -ef | grep nginx
  这里就是通过管道连接了 ps 和 grep 两个基本的 Unix 命令,在 ps -ef 的返回结果之上通过 grep nginx 筛选出 nginx 进程。
  在函数式编程中,我们也可以借助管道的思想串联一些简单的函数构建更加强大的功能,比如最常见的流式函数调用(水流一样,在面向对象编程中对应的是流接口模式,可以实现链式处理)。
  这样一来,每个函数就可以专注于自己要处理的事情,把它做到极致,然后通过组合方式(管道)构建更加复杂的业务功能,这也是符合 SOLID 设计原则的单一职责原则。
  通过管道重构 Map-Reduce-Filter 代码
  之前引入了 Map-Reduce-Filter 模式处理集合元素,并且提到分别调用这三个函数显得很繁琐,不够优雅,今天,我们正好可以通过管道模式实现这三个函数的流式调用。
  为了简化演示流程,对部分代码做了重新实现:
  package main
  import (
      "log"
  )
  type user struct {
      name string
      age  int
  }
  func filterAge(users []user) interface{} {
      var slice []user
      for _, u := range users {
          if u.age >= 18 && u.age <= 35 {
              slice = append(slice, u)
          }
      }
      return slice
  }
  func mapAgeToSlice(users []user) interface{} {
      var slice []int
      for _, u := range users {
          slice = append(slice, u.age)
      }
      return slice
  }
  func sumAge(users []user, pipes ...func([]user) interface{}) int {
      var ages []int
      var sum int
      for _, f := range pipes {
          result := f(users)
          switch result.(type) {
          case []user:
              users = result.([]user)
          case []int:
              ages = result.([]int)
          }
      }
      if len(ages) == 0 {
          log.Fatalln("没有在管道中加入 mapAgeToSlice 方法")
      }
      for _, age := range ages {
          sum += age
      }
      return sum
  }
  这里,我们引入了一个 user 结构体替代字典类型,让代码更加简洁,可读性更好,关于结构体类型,清华尹成大神将在下个章节 Go 类型系统中给大家详细介绍。
  然后我们将 Filter 和 Map 函数中的闭包函数取消掉了,改为直接在代码中实现,以便精简代码,为了便于通过管道统一声明 Filter 和 Map 函数,将他们的返回值声明成了空接口 interface{} 表示可以返回任何类型。
  接下来重点来看 Reduce 函数 sumAge 的实现,这里,我们将其第二个参数声明为了变长参数类型,表示支持传递多个处理函数,这些处理器函数按照声明的先后顺序依次调用,由于这些处理函数的返回值类型被声明为了空接口,所以需要在运行时动态对它们的返回值类型做检测,并赋值给指定变量,以便程序可以按照我们期望的路径执行下去,而不会因为类型问题报错退出(这是一个简单版的 Go 泛型实现,下一章节还会详细介绍):
  for _, f := range pipes {
      result := f(users)
      switch result.(type) {
      case []user:
          users = result.([]user)
      case []int:
          ages = result.([]int)
      }
  }
  最后一个处理函数的结果 ages 整型切片将作为 Reduce 函数求和逻辑的数据源。
  流式调用 Map-Reduce-Filter 函数
  我们在 main 函数中通过管道组合 Map-Reduce-Filter 功能模块,实现这些函数的流式调用:
  func main() {
      var users = []user{
          {
              name: "张三",
              age: 18,
          },
          {
              name: "李四",
              age: 22,
          },
          {
              name: "王五",
              age: 20,
          },
          {
              name: "赵六",
              age: -10,
          },
          {
              name: "孙七",
              age: 60,
          },
          {
              name: "周八",
              age: 10,
          },
      }
  sum := sumAge(users, filterAge, mapAgeToSlice)
      log.Printf("用户年龄累加结果: %d ", sum)
  }
  可以看到,之前要写好几行函数调用代码才能获取计算结果,现在只需要一行代码就可以搞定:
  sum := sumAge(users, filterAge, mapAgeToSlice)
  通过管道,我们可以更优雅地实现 Filter->Map->Reduce 的流式调用。此外,管道技术在 HTTP 请求处理中间件中也有广泛的应用,后面我们介绍 Web 编程时会提到。

DreamweaverCC2019forMAC如何自定义键盘快捷键dobeDreamweaver简称dw,是一款专业的网页设计软件,集网页制作和网站管理于一身的即时检索的网页代码编辑器,AdobeDreamweaver使用所见即所得的接口,亦有Hmac三维设计绘图软件AutoCAD怎样汉化激活?AutoCAD2018mac图文安装教程1下载完成后打开AutoCAD2018安装包,双击打开AutodeskAutoCAD2018MacOSX。dmg,如下图所示2双击打开Ins音乐会舞台摄影调色LR预设今天为大家分享的是音乐会舞台摄影调色lr预设,内含多种不同风格类型的Lightroom预设,包括lr黑白预设,lr暖色调预设,lr电影预设等,每个预设都经过精心设计,只需点击一下即LibreOfficeforMac一整套的Mac办公软件大放送!!!提起办公软件好多人首先想到的是office系列wps系列,那你就太孤寡闻了,这套LibreOfficeforMac办公套件远比office系列wps系列要强大的多,它是一款开源的办为什么Mac远程连接软件选择RemoteDesktopforMac?Mac远程连接软件哪款好用?macdown推荐MicrosoftRemoteDesktopmac,MicrosoftRemoteDesktop是一款MacOS平台上的远程桌面控制软打消里程焦虑,最高续航520km,这款纯电动SUV有多香?说到小鹏汽车,作为造车新势力的一员,相比起哪吒汽车零跑汽车这些,它的市场发展速度就快了许多,而这原因不仅仅在于小鹏汽车旗下的产品实力,更多的小鹏汽车足够有钱,请的起网红大V。今天我嫌凯美瑞太佛系?20来万选择这三款或许更合适,性能强品质优在20万级的中型车市场中,雅阁和凯美瑞可以说是许多消费者绕不开的一个选择。其中凯美瑞更是凭借着丰田可靠品质,以及全系TNGA架构和混动系统的加持,市场口碑是有着隐隐赶超雅阁的趋势。OmniPlanPro3项目流程管理软件如何使用?OmniPlanPro3如何使用,OmniPlan核心功能快速入门什么要用到OmniPlan?OmniPlan是MacOSX平台的的一款非常强大的项目管理软件,它提供的功能包含了自科学计算软件Mathematica12新增功能有哪些?Mathematica12Mac新增功能Mathematica12显着扩展了Mathematica的功能,并引入了许多增强功能,使系统更加平滑和高效。以下是具体新增功能!欢迎点击下RightFontforMac如何在团队中使用Dropbox同步和共享字体?RightFontforMac如何在团队中使用Dropbox同步和共享字体?RightFont可以与多种字体协作使用,并且可以轻松地与整个团队共享字体。在这篇文章中,您将学习使用DMac笔记本编辑工具Outline如何恢复笔记?Outline教程如何恢复在Outline中关闭的笔记本?如果您在Outline中意外关闭了笔记本,大多数情况下再次打开笔记本是很容易。本篇文章就让你小编给您详细讲解一下如何恢复在
爱回收5500万人民币战略投资值耀开展二手市场新征程近年来,互联网技术的发展消费电子产品制造水平的提高居民收入水平的增加,促使消费电子产品与互联网相融合逐步成为趋势,使用消费电子产品逐步成为居民日常生活的一部分,消费电子产品的销售额魅族化身流氓软件克星!首份手机安全白皮书即将发布手机安全隐私问题一直都是用户关注的重点,近些年来屡屡出现流氓软件私自窃取用户个人信息等事件,也已经引起了各行各界的高度重视,手机隐私安全大患一日未解决,我们的隐私都有可能暴露在不法不知道该如何选择路由器的上网模式,看完这篇文章,你就懂了很多朋友在安装调试路由器时,因为对网络不了解,也不知道自家所安装的宽带是什么类型,不知道该如何选择路由器的上网模式,本期文章以水星MW325R路由器为例,说说该如何选择路由器的上网蓝牙耳机怎么选?吐血整理目前最值得入手的蓝牙耳机在现如今这个快节奏的社会里,蓝牙耳机在生活中占据着越来越重要的地位,对于学生党很重要,无论是上网课还是听歌打游戏等等,都是必备品,但对于一些预算有限的学生党,想要选择一款好用且性价高德打车企业版与小米集团达成企业用车服务合作近日,高德打车企业版与小米集团正式达成企业用车服务合作。高德打车将帮助小米集团在员工出行体验财务报销效率企业费控管理等诸多方面进一步提升。据了解,小米集团正在实施差旅平台线上化升级太平洋电脑编辑推荐榜发布aigo移动固态硬盘S7Pro在榜aigo(爱国者)移动固态硬盘S7Pro荣获太平洋电脑网编辑移动SSD推荐榜第一名,并得众多业内人士的高度认可。随着数据时代的到来,最令用户关注的是电子产品的存储和运行速度,而随着小米平板5正式入网搭载骁龙870处理器支持5G网络日前,华为推出了早已预热过的MatePad11平板,这已经是华为今年推出的第三款平板产品了,且定位各不相同,全面发力三个档位的市场,充分说明华为对当下平板电脑产品线的重视。而除了华绿色科技,开拓不凡之路访广西交科橡胶沥青技术团队2021年是建党100周年,也是十四五开局之年,加快建设交通强国的关键之年。回首过去,我国交通基础建设在党的引领下,从以前的路途遥远车马慢,发展到如今千里之路半日达。翻天覆地的变化小米MIX4最新渲染图曝光双曲面屏100屏占比屏下摄像技术大家好,又见面了,我是专注数码资讯和二手数码回收的换换回收(此处已添加小程序,请到今日头条客户端查看)最新爆料,一批小米MIX4示意渲染图新鲜曝光,来自网友i冰宇宙给出的预览中,M亚洲品牌哪家强?印度塔塔排第47,茅台排第36,华为只排第8此前,世界品牌实验室发布了一份亚洲500强排行榜,引起广泛的关注和讨论。据介绍,该榜单主要是根据亚洲各大品牌的影响力进行测评,共有21个国家和地区的500个品牌入选。从行业分布来看小米手机这3个隐藏的功能,建议都打开!个个都特实用分享生活小妙招,共享科技新生活!大家好,欢迎来到今天的知识分享!我是你们的好朋友小俊!这一期我们来分享下小米手机上隐藏的3个功能!建议大家都打开,个个都特实用!一全局小窗口应用我们