游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

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

iPhone12和iPhone12Pro听筒无声音召回计划和不知道你们有没有出现过这样的问题,我有过几次跟家里打电话时,说着说着听筒突然就没声音了,重新再打电话又恢复正常,一开始我以为是家里的手机出了问题,或者是信号有问题,直到8月28……神奇乐园历险记发布放假啦版海报假期亲子观影再掀高潮星关系4月30日讯今日,由美国派拉蒙影片公司出品的合家欢冒险动画巨制《神奇乐园历险记》发布了一组放假啦版海报及预告。五一假期来临之际,朱妮和神奇乐园中可爱的小伙伴们在影院等待大……倪妮雪暴仁心演绎林区医生哭戏动人角色心存大爱星关系4月30日讯日前,由崔斯韦执导,张震、倪妮、廖凡领衔主演,黄觉、刘桦、张奕聪主演,李光洁特别出演的电影《雪暴》在北京举办首映礼。发布会上倪妮一袭黑色长裙优雅动人,同时还展……818十周年苏宁激情阿里京东冷淡电商第三大促何去何从?又是一年818!今年的818周年庆对于苏宁易购来说意义不同,这是在引入战投后苏宁易购迎来的第一个主场大促。相较于苏宁易购的激情澎湃,其他电商平台阿里、京东、拼多多等对于818电……大学生电影节闭幕导演刘苗苗携新片红花绿叶回家星关系4月29日讯4月28日,第26届大学生电影节闭幕式在北京师范大学举行。本届大学生电影节,共有34部电影入围主竞赛单元,包括《流浪地球》、《疯狂外星人》、《超时空同居》、《……锑矿要火?比尔盖茨出手投资锑电池来源:矿业界近日,美国初创储能公司AmbriInc宣布获得1。44亿美元融资,用于支持其新型电池的技术和商业化发展。本轮融资由战略投资者RelianceNewEnergy……宽带1000兆什么体验?我的宽带就是千兆,刚装的那会,确实很兴奋,换了路由,换了网线,特意去找了电影下载,一部几个g的电影,一分钟就下个了,确实很快!但是,除此之外,也没有什么了!200m宽带够干的活……音乐人文纪录电影尺八一声一世即将上映佐藤康夫空降高校巡展现场星关系4月28日讯4月26日,第六届中国国际大学生纪录片大赛暨高校巡展在广州启动。由聿馨(Helen)执导,佐藤康夫、小凑昭尚、蔡鸿文等主演,梁文道、陆川、龚琳娜特别出演的音乐……买苹果手机的哪个型号比较好吗?如果是5000元内,建议选择苹果iPhone7128GB版本,目前128GB版本在苹果官网的售价为5388元。虽然现在iPhone7已经上市,但在性能方面iPhone7还是非常……OPPO手机好还是vivo手机好?感谢您的阅读!OPPO手机好还是vivo手机好?我觉得在国产手机中有两个品牌,应该会让很多用户非常的习惯。第1个品牌是vivo,第2个品牌是OPPO,这两个品牌是目前国产……胡歌娜扎等力荐比悲伤更悲伤的故事台词戳心风靡全网星关系3月15日讯年度最催泪爱情电影《比悲伤更悲伤的故事》已于白色情人节当天上映,3月15日发布一支低估爱情版预告。这部拿下2018年中国台湾华语片票房冠军的电影,同样征服了内……三月首选爱情片比悲伤更悲伤的故事白色情人节公映星关系3月14日讯同档期最受期待爱情电影《比悲伤更悲伤的故事》3月14日白色情人节正式公映!这部由林孝谦执导,陈意涵、刘以豪、张书豪、陈庭妮主演的爱情片自公布引进内地的消息以来……
智能大空间,大众e起行上汽大众ID。6X高光派对圆满落幕7月11日,迎着避暑胜地的习习晚风,上汽大众ID。6X高光派对在信阳鸡公山顶闪亮开启。活动现场,华中核心媒体嘉宾悉数到场,通过ID初体验、ID再判断、ID终决选等环节体验,深刻……小鹏P5购车手册乍一看产品线丰富,分清楚系列却很好选择造车新势力,一提到这五个字或许大家都会联想到蔚来、小鹏、理想等新能源车企,这也充分说明了旗下车型的产品力逐渐得到了消费者的认可。而小鹏P7这样的纯电轿跑车型更是受年轻消费者的喜……为什么说客厅可能成为音乐ToB的下一个战场智能电视品牌们的竞争正在上升到一个更高的维度。12月12日,长虹在成都举办了一场发布会。一方面,宣布与腾讯音乐娱乐集团旗下酷狗音乐、爱听卓乐达成战略合作;另一方面,发布全……官方倒计时预热海报流出麦芒10SE5G即将登场最近,麦芒官方给出了一系列的预热海报,海报中的内容显示,麦芒10SE5G这款新机将于7月19日正式发布。从命名也可以看得出来,这是一款全新的5G手机,势必将会在5G方面有所作为……世界三大禁养犬名单,各个攻击性杀伤力极强,藏獒倒数第一第3名:藏獒被视为东方神犬,浑身上下透露着恶狠的气息,它凶猛善斗,体形硕大,领地意识非常强,对主人十分忠诚,但对陌生人有着超强的防范意识,咬人事件时而发生,现已被多个国家……蓝牙适配器SRRC检测办理流程蓝牙适配器SRRC检测办理流程。蓝牙适配器指数码产品适用蓝牙设备的接口转换器。主要是采用全球通用的短距离无线连接技术,使用与微波和部分无线电频段,有效避免此频段电子装置众多而造……静态体验福特MustangMachE,内饰直接大改,用电的马说起福特品牌,你第一个会想起哪台车呢?很多人会说起福特野马,这辆入门级的跑车在全球各地都深得车友们的认可。而在电动化时代到来的现在,福特也开始改变路线,福特电动车开始出现,作为……微缩建筑之美,深圳世界之窗用荣耀V30Pro记录微缩建筑之美。世界之窗位于广东省深圳市深圳湾社区深南大道,是中国著名的缩微景区,以弘扬世界文化为宗旨,是一个把世界奇观、历史遗迹、古今名胜、民间歌舞表演融……手把手教你用Pyecharts库对淘宝数据进行可视化展示来源:Python爬虫与数据挖掘作者:Python进阶者一、可视化可视化部分,我们采用Pyecharts库来进行完成,这个库作图十分的炫酷,而且可以交互,十分带感,……滴滴难道要凉了么?微信支付宝已经下架小程序在这里首先问一下大家,假如你没有车的情况下你出门办点事情你会怎么办呢?我相信大部分人会拿出手机使用滴滴app叫一辆网约车或者是花小猪等等,当然我相信使用率最多的还是滴滴出行。这……5G手机测试质量信誉度积分榜单发布!vivo成为最大赢家近日,中国移动终端实验室正式发布了2021年6月5G手机测试质量信誉度积分榜单,该榜单基于模块级的信誉度积分管理机制,能够直观地呈现各大手机厂商在产品质量方面的信誉度情况,可以……你在闲鱼上被坑过吗?有哪些例子?3月中在闲鱼上买了一个iphone6,国行64g的。对方开价2500,我还价1900。最后1920成交。刚开始让我先转钱过去再发货。大家想想,楼主会那么傻逼吗?3月11号,还没……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网