Skip to content

Commit 449ca66

Browse files
authored
Merge pull request #878 from devlights/add-go123-iter-examples
2 parents 6f07b8b + 9324ba3 commit 449ca66

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

examples/basic/iters/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
1919
m["iters_range_over_func_2"] = Go123RangeOverFunc2
2020
m["iters_range_over_func_3"] = Go123RangeOverFunc3
2121
m["iters_seq"] = IterSeq
22+
m["iters_seq2"] = IterSeq2
2223
}

examples/basic/iters/seq2.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package iters
2+
3+
import (
4+
"iter"
5+
6+
"github.com/devlights/gomy/output"
7+
)
8+
9+
// IterSeq2 は、Go 1.23 で正式導入となった iter.Seq2 のサンプルです。
10+
//
11+
// Range-Over-Func は、独自のイテレータを作成出来るようになる機能です。
12+
// 以下の関数パターンがサポートされています。
13+
//
14+
// - func(func() bool) : ループ変数に値を渡さないタイプ
15+
// - func(func(v) bool) : 1つのループ変数に値を渡すタイプ
16+
// - func(func(k, v) bool) : 2つのループ変数に値を渡すタイプ
17+
//
18+
// Go 1.23 にて追加された iter パッケージには以下の2つの型が定義されています。
19+
//
20+
// - iter.Seq[V any]
21+
// - iter.Seq2[K, V any]
22+
//
23+
// 上はそれぞれ func(v) bool と func(k, v) bool に対応しており、カスタムイテレータを
24+
// 戻り値や引数として指定したりする際に、イテレータであると利用者側に伝わりやすくなります。
25+
//
26+
// # REFERENCES
27+
// - https://tip.golang.org/doc/go1.23
28+
// - https://tip.golang.org/blog/range-functions
29+
// - https://tip.golang.org/ref/spec#For_range
30+
// - https://pkg.go.dev/iter@go1.23.3
31+
// - https://zenn.dev/koya_iwamura/articles/7e7482c7222e37
32+
// - https://tech.every.tv/entry/2023/12/09/1
33+
// - https://future-architect.github.io/articles/20240129a/
34+
func IterSeq2() error {
35+
var (
36+
// 指定された文字列を逆順でループ
37+
reverse = func(s string) iter.Seq2[int, string] {
38+
var (
39+
runes = []rune(s)
40+
runeLen = len(runes)
41+
)
42+
43+
return func(yield func(i int, s string) bool) {
44+
for i, j := 0, runeLen-1; i < runeLen; i, j = i+1, j-1 {
45+
if !yield(i, string(runes[j])) {
46+
return
47+
}
48+
}
49+
}
50+
}
51+
)
52+
53+
for i, v := range reverse("helloworld") {
54+
output.Stdoutf("[reverse(helloworld)]", "%d:%v\n", i, v)
55+
}
56+
57+
return nil
58+
}

0 commit comments

Comments
 (0)