在Golang 1.23版本中,一个引人注目的新特性便是引入了名为iter
的语法糖,这一变化为迭代器的使用带来了全新的体验。迭代器,作为处理集合数据的强大工具,在Go语言中的实现一直依赖于接口和闭包等特性,而此次iter
的加入,无疑为开发者提供了一种更为直观和简洁的迭代方式。本文将详细介绍Golang 1.23中iter
语法糖的相关类型及其使用,探讨如何自定义Seq和Seq2迭代器,并解析iter内置包对迭代器的基本定义及其提供的各种实用函数。
一、iter和Seq、Seq2是什么关系
参照源码中对iter相关类型的介绍,我们可以知道,自定义或者间接生成的Seq或Seq2类型,会被认为成iter迭代器,可用golang内置range进行遍历。
// 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)
二、怎么自定义Seq、Seq2迭代器
我们看到for range body中的逻辑被转换为了传给iterator函数的yield函数的实现了。
- Seq(v)
自己实现一个Seq迭代器:
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) {
// 写你的业务
}
}
- Seq2(k、v)
自己实现一个Seq2迭代器:
func Backward(s []string) func(yield func(int, string) bool) {
return func(yield func(int, string) bool) {
for i := len(s) - 1; i >= 0; i-- {
yield(i, strings.ToUpper(s[i]))
}
}
}
func ToUpperByIter() {
sl := []string{"hello", "world", "golang"}
for i, v := range Backward(sl) {
// 写你的业务
}
}
三、iter内置包对迭代器的基本定义是什么
新的 iter 包提供了使用用户定义迭代器的基本定义。
- slices 包添加了几个与迭代器配合使用的函数:
All 返回切片索引和值的迭代器。
Values 返回切片元素的迭代器。
Backward 返回反向循环切片的迭代器。
Collect 将迭代器中的值收集到新切片中。
AppendSeq 将迭代器中的值附加到现有切片。
Sorted 将迭代器中的值收集到新切片中,然后对切片进行排序。
SortedFunc 与 Sorted 类似,但具有比较函数。
SortedStableFunc 与 SortFunc 类似,但使用稳定的排序算法。
Chunk 返回切片中最多 n 个元素的连续子切片的迭代器。
- maps 包添加了几个与迭代器配合使用的函数:
All 返回来自映射的键值对的迭代器。
Keys 返回映射中键的迭代器。
Values 返回映射中值的迭代器。
插入将迭代器中的键值对添加到现有映射中。
收集将迭代器中的键值对收集到新映射中并返回它。
总结
Golang 1.23中引入的iter
语法糖为迭代器的使用带来了显著的简化,使得代码在部分场景下更加通用和易读。通过自定义Seq和Seq2迭代器,开发者可以灵活地控制迭代逻辑,满足多样化的需求。同时,iter内置包提供的丰富函数进一步增强了迭代器的功能,使得处理集合数据变得更加高效和便捷。尽管对于这一新特性,开发者社区中存在着关于性能、复杂性和学习曲线的不同声音,但不可否认的是,iter
的引入为Go语言注入了新的活力,为函数式编程实践在Go语言中的推广提供了有力支持。
延展阅读:
大促期间买家恶意购买影响口碑,淘宝店铺怎么设置限制顾客下单?
咨询方案 获取更多方案详情