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

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

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

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

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

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

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

在这之前循环将切片数据全部转换为大写时的写法:uzQ28资讯网——每日最新资讯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 迭代器之后:uzQ28资讯网——每日最新资讯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    } }

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

通过性能比较,ToUpperByIter 方法性能更高,因为它不需要重新分配新的切片。uzQ28资讯网——每日最新资讯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 软件包提供了两种迭代器类型:uzQ28资讯网——每日最新资讯28at.com

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

具体函数声明如下:uzQ28资讯网——每日最新资讯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 等方法。uzQ28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

参考链接:uzQ28资讯网——每日最新资讯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++多线程中的互斥锁

标签:
  • 热门焦点
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
Top