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

Go1.23 新特性:争议最大的 iter 迭代器,可遍历万物!

来源: 责编: 时间:2024-09-10 09:47:14 36观看
导读大家好,我是煎鱼。Go1.23 新版本中,在发布过程中争议最大的新特性莫过于:迭代器(iterators)。原本计划先写一个这个 proposal 的提出背景的,但没想到,迭代器涉及的到 proposal 比较多,而且是由 rsc 亲自负责。总感觉 rsc 早有

大家好,我是煎鱼。f9F28资讯网——每日最新资讯28at.com

Go1.23 新版本中,在发布过程中争议最大的新特性莫过于:迭代器(iterators)。f9F28资讯网——每日最新资讯28at.com

原本计划先写一个这个 proposal 的提出背景的,但没想到,迭代器涉及的到 proposal 比较多,而且是由 rsc 亲自负责。f9F28资讯网——每日最新资讯28at.com

总感觉 rsc 早有预谋,在 Go1.23 蓄力一击,搞完就撤了。f9F28资讯网——每日最新资讯28at.com

Go1.23 新特性:迭代器

提出过程

我能翻到的最早明确提出要加迭代器是在 discussions/54245[1] 中进行了广泛讨论:f9F28资讯网——每日最新资讯28at.com

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

随后折腾了许久,最终 rsc 牵头在 discussions/56413[2] 做了初步敲定:f9F28资讯网——每日最新资讯28at.com

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

后面今年 《spec: add range over int, range over func》[3],包含在 for-range int 和 function 中再次冲击新特性:f9F28资讯网——每日最新资讯28at.com

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

我就不一一列举和解释了。大家可以理解为比较折腾高密度讲了很久。f9F28资讯网——每日最新资讯28at.com

为什么要做

根据 Go 官方几个 issues 和 discussions 的说法,汇总一下。具体缘由如下:f9F28资讯网——每日最新资讯28at.com

  1. 其他编程语言有提供:大多数变成语言都提供了使用迭代器接口遍历存储在容器中的值的标准化方法。
  2. Go 就差迭代器没提供了:Go 提供了可用于 map、slices、stings、 array 和 channel 的 for range,但没有为用户编写的容器提供任何通用机制,也没有提供迭代器接口。
  3. 现在大家都各自为政:社区和官方最终采用了各种各样的方法去实现类似功能,每种实现都采用了在当时情况下最合理的方法,但各自为政的决定却给用户带来了许多困惑。

“容器” 指代的是什么

有同学会疑惑第一点中提到的容器是什么?f9F28资讯网——每日最新资讯28at.com

实际上指代的是:使用迭代器 “提供一种按顺序访问聚合对象元素的方法,而无需暴露其底层表现”。f9F28资讯网——每日最新资讯28at.com

这句话中所说的聚合对象就是上文中所提到的容器。聚合对象或容器只是一个包含其他值的值。f9F28资讯网——每日最新资讯28at.com

Go 标准库里的各自实现

具体 Go 标准库中各自为政的。例如:f9F28资讯网——每日最新资讯28at.com

  • runtime.CallersFrames:Frames.Next 方法。
  • bufio.Scanner:Scanner.Scan 方法。
  • database/sql.Rows:Rows.Scan 和配套 Rows.Next 方法。

有兴趣的可以自己看一下函数调用或实现。f9F28资讯网——每日最新资讯28at.com

平时写业务代码都会接触到。这里就不深入展开了。f9F28资讯网——每日最新资讯28at.com

Go1.23 迭代器介绍

功能说明

在 Go 1.23 中,将会同时支持用户定义容器类型的 for-range 和标准化形式的迭代器。f9F28资讯网——每日最新资讯28at.com

本次新版本中:f9F28资讯网——每日最新资讯28at.com

  • 扩展了 for/range 语句,使其支持对函数类型的取值范围。
  • 添加了标准库类型和函数,以支持将函数类型用作迭代器。

后续通过新增的迭代器的标准定义,我们编写的函数可以顺利地与不同的容器类型配合使用。f9F28资讯网——每日最新资讯28at.com

有种可以循环遍历万物的感觉。f9F28资讯网——每日最新资讯28at.com

迭代器的快速例子

以下是 Go1.23 中迭代器的一些基础的标准例子。f9F28资讯网——每日最新资讯28at.com

分别包含:单值迭代器和二值迭代器。f9F28资讯网——每日最新资讯28at.com

前置知识:yield

在 Go 中,yield 关键字的引入使得函数可以像迭代器一样工作。这一特性是在 Go 1.22 版本中被提出的,允许函数在执行过程中暂时挂起,并返回一个或多个值。f9F28资讯网——每日最新资讯28at.com

这种机制与其他编程语言(如:Python)中的 yield 关键字有些相似,但在 Go 中实现的方式有所不同。f9F28资讯网——每日最新资讯28at.com

以下是关于 Go 中 yield 关键字的一些关键点:f9F28资讯网——每日最新资讯28at.com

  • 功能:yield 关键字使得函数能够在执行时返回一个或多个值,并在下次调用时从上次返回的地方继续执行。这样可以有效地处理大量数据而不需要一次性加载所有数据。
  • 用法:在 Go 中,yield 并不是一个独立的关键字,而是作为一种函数参数的形式出现。具体来说,函数可以接受一个 yield 函数作为参数,该函数负责接收生成的值并返回一个布尔值,指示是否继续迭代。

例子一:单值迭代器(iter.Seq)

示例代码如下:f9F28资讯网——每日最新资讯28at.com

import ( "fmt" "iter")func Stat(v int) iter.Seq[int] { return func(yield func(int) bool) {  for i := v; i >= 0; i-- {   if !yield(i) {    return   }  } }}func main() { for v := range Stat(11) {  fmt.Println(v) }}

输出结果:f9F28资讯网——每日最新资讯28at.com

11109876543210

例子二:二值迭代器(iter.Seq2)

示例代码如下:f9F28资讯网——每日最新资讯28at.com

func Backward[E any](s []E "E any") iter.Seq2[int, E] { return func(yield func(int, E) bool) {  for i := len(s) - 1; i >= 0; i-- {   if !yield(i, s[i]) {    return   }  } }}func main() { sl := []string{"脑子", "进", "煎鱼", "了"} for i, s := range Backward(sl) {  fmt.Printf("%d: %s/n", i, s) }}

输出结果:f9F28资讯网——每日最新资讯28at.com

3: 了2: 煎鱼1: 进0: 脑子

标准库内的迭代器使用

slices

本次 Go1.23 在 slices 标准库中针对迭代器,新增了:slices.All、slices.Values、slices.Collect 方法。f9F28资讯网——每日最新资讯28at.com

函数签名如下:f9F28资讯网——每日最新资讯28at.com

func All[Slice ~[]E, E any](s Slice "Slice ~[]E, E any") iter.Seq2[int, E]func Values[Slice ~[]E, E any](s Slice "Slice ~[]E, E any") iter.Seq[E]func Collect[E any](seq iter.Seq[E] "E any") []E

示例代码如下:f9F28资讯网——每日最新资讯28at.com

func main() { s1 := []int{1, 2, 3} for k, v := range slices.All(s1) {  fmt.Println("k:", k, "v:", v) } for v := range slices.Values(s1) {  fmt.Println(v) } // slices.Collect 会将迭代器中的值收集到一个新的切片中并返回它 s2 := slices.Collect(slices.Values([]int{1, 2, 3})) fmt.Println(s2)}

输出结果:f9F28资讯网——每日最新资讯28at.com

k: 0 v: 1k: 1 v: 2k: 2 v: 3123[1 2 3]

maps

maps 标准库中针对迭代器,新增了:maps.All、maps.Keys、maps.Values、 方法。f9F28资讯网——每日最新资讯28at.com

函数签名如下:f9F28资讯网——每日最新资讯28at.com

func All[Map ~map[K]V, K comparable, V any](m Map "Map ~map[K]V, K comparable, V any") iter.Seq2[K, V]func Keys[Map ~map[K]V, K comparable, V any](m Map "Map ~map[K]V, K comparable, V any") iter.Seq[K]func Values[Map ~map[K]V, K comparable, V any](m Map "Map ~map[K]V, K comparable, V any") iter.Seq[V]

示例代码如下:f9F28资讯网——每日最新资讯28at.com

func main() { m := map[string]int{  "脑子": 1,  "进":  2,  "煎鱼": 3,  "了":  4,  "吗":  5, } for k, v := range maps.All(m) {  fmt.Println("k:", k, "v:", v) } for k := range maps.Keys(m) {  fmt.Println(k) } for v := range maps.Values(m) {  fmt.Println(v) }}

输出结果:f9F28资讯网——每日最新资讯28at.com

// maps.Allk: 吗 v: 5k: 脑子 v: 1k: 进 v: 2k: 煎鱼 v: 3k: 了 v: 4// maps.Keys脑子进煎鱼了吗// maps.Values34512

总结

Go1.23 的迭代器引入,对于 Go 来讲是一个重要的里程碑。虽然在社区上引来了国外社区的大量争议。但也带来了 for-loop 的完整体系的建设,提供了迭代器可遍历万物的概念。f9F28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-112724-0.htmlGo1.23 新特性:争议最大的 iter 迭代器,可遍历万物!

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

上一篇: 架构设计的简单原则,你学会了吗?

下一篇: 还不会用Java操作远程服务器?

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top
Baidu
map