emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go1.23 の range-over func を使って高階関数を書いてみた

Overview

Go1.23 から導入される Iterator を使って Chunk 処理を書く - emahiro/b.log を書いた当日(日本時間だと翌日だけど)Go 1.23 が正式にリリースされていたので、サンプルとして range-over func を使った高階関数のセットを書いてみた。

Repository

リポジトリは以下

github.com

Usecase

Filter や Chunk は登場シーンが多いんじゃないかと思う。

例えばフィルタリング処理であれば、ある処理を行うのにフィルタされたデータセットが必要な場合、今までは事前に for-loop でフィルタリング処理を行う or sices.DeleteFunc 等で条件にそぐわない要素を削除しておき、前処理で作られた slices に対して本処理を行っていたところ、Filter 関数を使うと for の中でフィルタされたデータを使うことができる。

list := ....

for i := range hof.Filter(list,  func(v int) bool { return v%2 == 0 }) {
    // 偶数のみが for-loop に入ってくる
}

Chunk は前述したブログに記載した通り、配列を Chunk したセットが for-loop に入ってくるので、小刻みな処理を行いたいときに使える(かつパフォーマンスも良い)

Reduce や Map/Map2 といった処理は書いては見たものの、利用したいシーンはまだ特に思いつかない。
大きなデータを扱うようなユースケースであればデータの前処理や後処理で活躍しそうな気はした。

その他

この辺で書いてみた関数の一部 (Chunk とか)は slices package に iterator として用意されています。