BackEnd

Go 1.23 で追加された iter パッケージを使ってみる

投稿日:

はじめに

Go 1.23.0 で追加された iter パッケージ(と range over func )により、 for にメソッドを渡して反復処理を行えるようになりました。これらの使い方について紹介します。

iteratorとは

iterator とは、配列やコレクションなどの連続したデータを順番に処理するための仕組みです。

Goにおいては、コールバック関数を受け取る関数として定義します。このコールバック関数は慣習的に yield と名付けられます。

イテレータ関数は以下の2つのシグネチャの内、どちらかで定義します。

  • func (yield func (v) bool)
  • func (yield func (k, v) bool)

この内、 kv はMapのKey、Valueと同様の値をとります。

また、イテレータにはpush方式とpull方式の2つの方式があります。まずはpush方式のイテレータを定義してみます。

push方式のイテレータ

まずは以下のコードをご覧ください。

このコードでは、 myIter 関数を定義して、それを for ループで実行していきます。

myIter 関数の中では、0から4の値を順番にpushしていき、それが都度 for に渡されます。

このコードを実行した際のログは以下のとおりです。

このように、 yield が一回実行される事に、 for の内部が一度実行されることがわかります。

kとvを受け取るイテレータ関数

引数としてkとvを受け取るタイプのイテレータ関数も定義してみます。

以下のコードをご覧ください。

先程のイテレータ関数とほとんど同じです。

このコードを実行した際のログは以下のとおりです。

イテレータ関数をチェインさせる

イテレータ関数の応用として、イテレータ関数を受け取るイテレータ関数を定義することで、複数のイテレータ処理をチェインして処理することができます。

以下のコードをご覧ください。

このコードでは、3つのイテレータ関数をチェインさせて実行しています。

source関数は1から10までの値を返すイテレータ関数を返します。

filter関数はそれを受け取って内部で実行し、偶数のみを返すイテレータ関数を返します。

square関数はfilter関数を受け取って内部で実行し、値を2乗して返すイテレータ関数を返します。

このコードを実行すると、1から10までの数値のうち偶数のみを2乗して出力しまう。

このコードを実行した際のログは以下のとおりです。

イテレータ関数の型を利用する

iter パッケージには、イテレータ関数を定義する際に使える便利な方が定義されています。

これを使って先ほどのコードを書き直したものがこちらになります(変更箇所のみ抜粋)。

この通り、シグネチャはGenericsとして定義されているので、任意の型を渡すことができます。

イテレーションを止める

イテレーション関数を呼び出している for から break で抜けるなどした場合、このままではランタイムエラーが発生してしまいます。

そこで、 yield の返り値が false だった場合に for から抜けるようにすることで、エラーが発生しないようにすることができます。

pull方式のイテレータ

push方式のイテレータをpull方式に変換して実行することができます。

まずはコードをご覧ください。

このように、 iter.Pull 関数を使ってイテレータ関数をpull方式に変換することができます。

なお、pull方式のイテレータを扱う際の注意点として、以下の2つがあげられます。

  • 必ず close 関数を呼ぶこと
  • next 関数の戻り値をハンドリングすること

さいごに

Go 1.23 で登場した iter パッケージを使ったイテレーション関数の実装について紹介しました。

おすすめ書籍

初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ 効率的なGo ―データ指向によるGoアプリケーションの性能最適化

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた その4 モジュール編

1 はじめに2 Rustのモジュール2.1 モジュールツリーの構築2.2 サブモジュール2.3 各モジュールの実装2.4 モジュールのプライバシー3 さいごに4 おすすめ書籍 はじめに これまでの記事 ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

MySQLでバルクアップデート処理

1 はじめに2 使用するテーブル3 パターン数が少ないシンプルな更新4 パターン数が多い場合4.1 FIELD関数4.2 ELT関数4.3 組み合わせ4.4 パフォーマンス5 さいごに6 おすすめ書籍 ...

laravel logo

Server-Side Eventsを触ってみた

1 はじめに2 Server-Side Events(SSE) とは3 実装してみる3.1 動作の流れ3.2 Laravel側3.3 React側4 Chat GPTのレスポンス5 さいごに6 おすす ...

rails

Rails5で出力される「alias_method_chain is deprecated.」について

1 はじめに2 alias_method_chainとは3 Module#prependとは4 とりあえず、DEPRECATION WARNINGの出力をなくしたい5 さいごに はじめに 直近のプロジ ...

フォロー

blog-page_side_responsive

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。