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

golang2021数据格式(58)模式处理集合元素

  从处理集合元素聊起
  日常开发过程中,要处理数组、切片、字典等集合类型,常规做法都是循环迭代进行处理。比如将一个字典类型用户切片中的所有年龄属性值提取出来,然后求和,常规实现是通过循环遍历所有切片,然后从用户字典键值对中提取出年龄字段值,再依次进行累加,最后返回计算结果:
  package main
  import (
      "fmt"
      "strconv"
  )
  func ageSum(users []map[string]string) int {
      var sum int
      for _, user := range users {
          num, _ := strconv.Atoi(user["age"])
          sum += num
      }
      return sum
  }
  func main() {
      var users = []map[string]string{
          {
              "name": "张三",
              "age": "18",
          },
          {
              "name": "李四",
              "age": "22",
          },
          {
              "name": "王五",
              "age": "20",
          },
      }
      fmt.Printf("用户年龄累加结果: %d ", ageSum(users))
  }
  执行上述代码,打印结果如下:
  注:为了简化流程,这里忽略了程序出错的处理。
  针对简单的单个场景,这么实现没什么问题,但这是典型的面向过程思维,而且代码几乎没有什么复用性可言:每次处理类似的问题都要编写同样的代码模板,比如计算其他字段值,或者修改类型转化逻辑,都要重新编写实现代码。
  引入 Map-Reduce
  在函数式编程中,我们可以通过 Map-Reduce 技术让这个功能实现变得更优雅,代码复用性更好。
  Map-Reduce 并不是一个整体,而是要分两步实现:Map 和 Reduce,这个示例也正好符合 Map-Reduce 模型:先将字典类型切片转化为一个字符串类型切片(Map,字面意思就是一一映射),再将转化后的切片元素转化为整型后累加起来(Reduce,字面意思就是将多个集合元素通过迭代处理减少为一个)。
  为此,我们先要实现 Map 映射转化函数:
  func mapToString(items []map[string]string, f func(map[string]string) string) []string {
      newSlice := make([]string, len(items))
      for _, item := range items {
          newSlice = append(newSlice, f(item))
      }
      return newSlice
  }
  再编写 Reduce 求和函数:
  f
  func fieldSum(items []string, f func(string) int) int {
      var sum int
      for _, item := range items{
          sum += f(item)
      }
      return sum
  }
  通过 Map-Reduce 重构后没有什么硬编码,类型转化和字段获取逻辑都封装到两个函数支持的函数类型参数中实现了,
  在 main 函数中编写新的调用代码如下:
  ageSlice := mapToString(users, func(user map[string]string) string {
      return user["age"]
  })
  sum := fieldSum(ageSlice, func(age string) int {
      intAge, _ := strconv.Atoi(age)
      return intAge
  })
  fmt.Printf("用户年龄累加结果: %d ", sum)
  计算结果和之前一样,看起来代码实现比之前的简单迭代更复杂了,但是代码复用性、可读性和后续可维护性更好,毕竟,对于长期维护的项目而言,业务代码不可能一次编写好就完事了。目前来看,只要是符合上述约定参数类型的切片数据,现在都可以通过这段代码来实现指定字段值的累加功能,并且支持自定义字段和数值类型转化逻辑。
  当然了,Go 语言现在还不支持泛型,否则我们可以编写出抽象性更好的 Map-Reduce 代码,后面介绍完接口和反射部分后,我们再尝试在运行时通过泛型来重构这段代码的实现。
  采用 Map-Reduce 技术编写类似的集合处理代码为我们引入了新的编程模式,将编程思维升级到描述一件事情要怎么干的高度,就像面向对象编程中引入设计模式那样,从而摆脱面向过程编程那种代码只是用来描述干什么,像记流水账一样的编程窠臼。
  下面这张图非常形象地描述了 Map-Reduce 技术在函数式编程中扮演的角色和起到的作用:
  引入 Filter 函数
  有的时候,为了让 Map-Reduce 代码更加健壮(排除无效的字段值),或者只对指定范围的数据进行统计计算,还可以在 Map-Reduce 基础上引入 Filter(过滤器),对集合元素进行过滤。
  我们在上面的代码中新增一个 Filter 函数:
  func itemsFilter(items []map[string]string, f func(map[string]string) bool) []map[string]string {
      newSlice := make([]map[string]string, len(items))
      for _, item := range items {
          if f(item) {
              newSlice = append(newSlice, item)
          }
      }
      return newSlice
  }
  接下来,我们可以在 main 函数中应用 Filter 函数对无效用户年龄进行过滤,或者排除指定范围年龄:
  func main() {
      var users = []map[string]string{
          {
              "name": "张三",
              "age": "18",
          },
          {
              "name": "李四",
              "age": "22",
          },
          {
              "name": "王五",
              "age": "20",
          },
          {
              "name": "赵六",
              "age": "-10",
          },
          {
              "name": "孙七",
              "age": "60",
          },
          {
              "name": "周八",
              "age": "10",
          },
      }
      //fmt.Printf("用户年龄累加结果: %d ", ageSum(users))
  validUsers := itemsFilter(users, func(user map[string]string) bool {
          age, ok := user["age"]
          if !ok {
              return false
          }
          intAge, err := strconv.Atoi(age)
          if err != nil {
               return false
          }
          if intAge < 18 || intAge > 35 {
              return false
          }
          return true
      })
      ageSlice := mapToString(validUsers, func(user map[string]string) string {
          return user["age"]
      })
      sum := fieldSum(ageSlice, func(age string) int {
          intAge, _ := strconv.Atoi(age)
          return intAge
      })
      fmt.Printf("用户年龄累加结果: %d ", sum)
  }
  上述代码的计算结果依然是 60,说明过滤器生效了。
  不过分开调用 Map、Reduce、Filter 函数不太优雅,我们可以通过装饰器模式将它们层层嵌套起来,或者通过管道模式(Pipeline)让这个调用逻辑可读性更好,更优雅.

vivo的骁龙870仅售价1599元,还买什么天玑1200手机?文小伊评科技在某多多平台,8128G够用版本的IQOONeo5活力版的价格为1599元,请注意是8128G的版本,不是6128G的低配版,在JD自营平台的价格为1699元。这款手机2022年3月1号起个人微信。支付宝收款码都不能收费了吗?这显然是谎言谣传!国家都在大力发展网络升级!都在提倡数字人民币支付,数字化网络支付是创新便捷的未来!互联网支付开创了消费新时代新起点!应该是大力发展和提高!利国利民便捷快速!何乐而高效热水器耗电是低效热水器的九分之一,选错损失几万元家庭选用热水器,绝大多数没有考虑过使用成本,总觉得使用的热水量不多,省也省不了多少钱。且不知道,每冲个凉都会多花12元钱,日积月累,可不是小数目,人数多的家庭,每年节省的钱,足够购情人节送礼指南,SamsungBESPOKE系列冰箱来支招随着虎年春节的年味逐渐收尾,充满爱意的情人节又悄然而至。这个处处洋溢着爱与浪漫的特殊日子里,世界上不同国家的情侣们都在以各式各样的形式秀恩爱,品牌商们也为新一轮的浪漫经济铆足马力创SAP系统好用嘛SAP起源于SystemsApplication,ProductsinDATAprocessing。SAP既是公司名称,又是其ERP(EnterprisewideResourceP从鸿蒙系统换回MIUI的2周后不吹不黑,说一说几句中肯的心里话相信很多人都和我一样,平常会使用两款手机。一款用来工作,一款用于生活和日常娱乐,分工明确,互不干扰,我之前的主力机是华为P50Pro,今年又买了一款小米12Pro,它们都拥有超高规如何在Linux系统上允许远程连接到MySQL服务器?在Linux系统上安装MySQL服务器后,默认情况下它只接受来自自身的传入连接(即环回地址127。0。0。1)。如果您只是尝试从同一服务器上的数据库读取或写入信息,则此默认配置可以教你走出被裁员的阴霾滴滴开启了覆盖几乎全公司裁员计划!滴滴这一次各部门裁员比例不一,滴滴网约车两轮车货运等出行业务的leader都收到了裁员通知。总体裁员比例约为20,职能和业务线都要背负裁员20的指深度分析NFT爆火的原因是什么NFT爆火的原因是什么?在2021年,NFT以各种天价故事和众多名人入局带给我们全新的体验。越来越多的名人收藏家参与并投资NFT,进而带动越来越多的增量用户入场。大量的NFT交易平数字货币牌照如选择?申请需要具备哪些条件,推荐MSB数字货币金融牌照一般是指在某个国家或地区的运营数字货币相关业务的许可牌照。拥有数字货币金融牌照则代表此机构可在发放当地进行与数字货币有关的业务和衍生服务。如开设数字货币交易所支付数武极日报Intel第一款矿卡官宣!能效比1000多倍碾压GPU显卡要闻Intel第一款矿卡官宣!能效比1000多倍碾压GPU显卡日前有证据显示,Intel正在开发一款专门用于比特币挖矿的矿卡,确切地说是ASIC加速芯片,并与大客户达成了长期合作。
西部数据(WDC。US)日本工厂材料受污染闪存设备供应将减少智通财经APP获悉,西部数据(WDC。US)周三表示,其在日本的两家制造工厂的某些材料受到污染,将导致闪存设备的供应减少。据悉,上述两家工厂为西部数据与合资伙伴铠侠共同运营。根据西优步就窃取谷歌无人驾驶技术案与涉案工程师达成和解鞭牛士2月11日消息,据华尔街日报消息,优步解决关于其涉及窃取谷歌无人驾驶汽车技术的一桩破产法庭诉讼,同意与一名前工程师达成和解。该工程师之前声称,在他盗用商业机密一事上,优步也负C数据输入(输出)from(to)keyboard(screen)filestringC和C中有三类输入输出操作standardIO(标准IO),通常是指用键盘做入输入,显示屏做为输出fileIO(文件IO),硬盘文件既可以是数据输入源,也可以是输出的去向。stri恶意软件开发者主动公开MazeEgregorSekhmet解密密钥昨晚,据称是恶意软件开发者在国外BleepingComputer论坛上发帖,公开了MazeEgregor和Sekhmet勒索软件操作的主解密密钥。经安全公司Emsisoft确认这些大公司早报喜茶回应裁员30王者荣耀1月收入环比大增92(整理胡毓靖)今天是2月10日星期四,过去24小时的大公司新闻包括腾讯回应应届生怼管理层被标记永不录用严重失实喜茶回应裁员30因使用过期食材,星巴克两门店合计被罚百余万元1月王者荣鸿蒙来袭,抢先升级体验好,看看拥抱鸿蒙的五大社交软件有哪些?中国人自己的手机操作系统来了!6月2日晚上,华为公司举行HarmonyOS及华为全场景新品发布会,正式发布了鸿蒙手机操作系统。鸿蒙苹果安卓开始呈现三足鼎立的现象,而就在鸿蒙发布会上华为看来现在是618最热门手机品牌?用过mate系列的都知道原因现在看起来,华为手机还是很多人支持的,这次618至少现在看起来,华为手机的预售是第一?其实华为真正的中高端手机也就是mate系列确实不错!这应该算最近几年安卓手机里面性能最均衡的!微信越来越QQ化更新频繁,功能不实用微信作为一个几亿人在同时使用的社交软件,拥有非常庞大的用户基础,所以微信的每一次更新,都会引起网友一阵讨论。今年年初的时候,微信8。0也是在万众瞩目中上线,当时微信8。0在微博上的荣耀50系列将无缘麒麟芯片,首发骁龙778G最近高通发布了一款全新的中端芯片,骁龙778G,此款芯片与之前发布的骁龙780G综合实力上来看差距不大,据悉荣耀50系列将全线搭载此芯片。骁龙778G芯片采用四颗主频为2。4GHz三星手机用户看过来请查收这份拍照功能指南当下,市面上号称影像旗舰的手机有很多,这些旗舰的传感器硬件素质都不差,随便拉出一个来都可谓出类拔萃。但是手机影像传感器的硬件堆料是身为旗舰的基本要求,用户真正关心的还是拍摄体验的便携程梁建章提议,生一个孩子100万,上市公司这叫虚假信息携程董事局主席梁建章先生这个议题生一个孩子100万很好慢牛哥举双手双脚赞成但细细品味似乎没法实施尤其是在中国但他所呼喊的的的确确是大多数人的呼声与白岩松笨重的说教比起来这种一心只为