当前位置:首页 > 科技  > 软件

Go 1.23:拥抱iter包,简化你的迭代逻辑

来源: 责编: 时间:2024-06-24 09:10:30 274观看
导读最近 Go1.23 进入了冻结阶段,意味着不再添加新功能,而且已经加入的功能也不再会删除。Go 1.23 正式引入了 iter 软件包,这是一个专门用于 Iterators 的新特性。该软件包在 Go 1.22 中作为实验性功能,需要通过 GOEXPERIMEN

最近 Go1.23 进入了冻结阶段,意味着不再添加新功能,而且已经加入的功能也不再会删除。cuY28资讯网——每日最新资讯28at.com

Go 1.23 正式引入了 iter 软件包,这是一个专门用于 Iterators 的新特性。cuY28资讯网——每日最新资讯28at.com

该软件包在 Go 1.22 中作为实验性功能,需要通过 GOEXPERIMENT=rangefunc 参数启用。cuY28资讯网——每日最新资讯28at.com

在 Go 1.23 中,开发者可以直接通过代码实现迭代。cuY28资讯网——每日最新资讯28at.com

在这之前循环将切片数据全部转换为大写时的写法:cuY28资讯网——每日最新资讯28at.com

func Convert[S any, D any](src []S, mapFn func(s S) D) []D {       r := make([]D, 0, len(src))       for _, i := range src {          r = append(r, mapFn(i))       }       return r   }      func ToUpByString() {       sl := []string{"hello", "world", "golang"}       s0 := Convert(sl, func(v string) string { return strings.ToUpper(v) })       for _, v := range s0 {          // do business     }   }

而在使用新的 Iter 迭代器之后:cuY28资讯网——每日最新资讯28at.com

func Backward(s []string) func(yield func(string) bool) {   return func(yield func(string) bool) {     for i := len(s) - 1; i >= 0; i-- {       yield(strings.ToUpper(s[i]))     }   } }  func ToUpperByIter() {   sl := []string{"hello", "world", "golang"}   for v := range Backward(sl) {     // do business    } }

可以发现明显的代码量减少了,同时更符合函数式编程的特性。cuY28资讯网——每日最新资讯28at.com

通过性能比较,ToUpperByIter 方法性能更高,因为它不需要重新分配新的切片。cuY28资讯网——每日最新资讯28at.com

➜  huizhou92 git:(master) ✗ go test -bench . -count=3 goos: darwin goarch: arm64 pkg: huizhou92 cpu: Apple M1 Pro BenchmarkToUpByString-10         8568332               128.7 ns/op BenchmarkToUpByString-10         9310351               128.6 ns/op BenchmarkToUpByString-10         9344986               128.5 ns/op BenchmarkToUpByIter-10          12440120                96.22 ns/op BenchmarkToUpByIter-10          12436645                96.25 ns/op BenchmarkToUpByIter-10          12371175                96.64 ns/op PASS ok      huizhou92       8.162s

iter 软件包提供了两种迭代器类型:cuY28资讯网——每日最新资讯28at.com

  • Seq 用于单个值的迭代
  • Seq2 用于键值对的迭代。

具体函数声明如下:cuY28资讯网——每日最新资讯28at.com

// Seq is an iterator over sequences of individual values. // When called as seq(yield), seq calls yield(v) for each value v in the sequence, // stopping early if yield returns false.   type Seq[V any] func(yield func(V) bool)      // Seq2 is an iterator over sequences of pairs of values, most commonly key-value pairs. // When called as seq(yield), seq calls yield(k, v) for each pair (k, v) in the sequence, // stopping early if yield returns false.   type Seq2[K, V any] func(yield func(K, V) bool)

iter 软件包的目标是提供一种统一和高效的迭代方法,并且已经在 map 包中添加了 All 和 Keys 等方法。cuY28资讯网——每日最新资讯28at.com

具体列表如下:cuY28资讯网——每日最新资讯28at.com

图片图片cuY28资讯网——每日最新资讯28at.com

图片图片cuY28资讯网——每日最新资讯28at.com

而社区对于 yield 和 iter 的引入有不同意见,有人认为它会引入复杂性和难以可理解的代码,而另一些则认为它能够帮助开发者简化代码并采用更多函数式编程。cuY28资讯网——每日最新资讯28at.com

个人觉得  Go 在新版本映入一些新特性是有必要的,这样才能保持社区的活跃,同时选择权也是交给开发者的。cuY28资讯网——每日最新资讯28at.com

类似的在 Java8 中引入的 lambda 表达式起初也是有很多人反馈难以阅读与调试,经过这么多年的普及以及 IDE 的支持,现在已经成为大多数开发者的标配了。cuY28资讯网——每日最新资讯28at.com

参考链接:cuY28资讯网——每日最新资讯28at.com

  • https://tip.golang.org/doc/go1.23#iterators
  • https://levelup.gitconnected.com/go-1-23-new-iter-package-4ae649a0e910
  • https://pkg.go.dev/iter@master#hdr-Iterators

本文链接:http://www.28at.com/showinfo-26-95916-0.htmlGo 1.23:拥抱iter包,简化你的迭代逻辑

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 电商系统开发所遇问题及C#实例解析

下一篇: C++多线程中的互斥锁

标签:
  • 热门焦点
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • iQOO Neo8 Pro抢先上架:首发天玑9200+ 安卓性能之王

    经过了一段时间的密集爆料,昨日iQOO官方如期对外宣布:将于5月23日推出全新的iQOO Neo8系列新品,官方称这是一款拥有旗舰级性能调校的作品。随着发布时
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top