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


関連記事

PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜

1 はじめに2 インターフェース2.1 基本2.2 デフォルト実装付メソッド2.3 同じメソッド名を持つ複数のインターフェース3 修飾子3.1 open3.2 abstract4 可視性修飾子5 さい ...

laravel logo

Laravel SailでDocker環境構築

1 はじめに2 Laravel Sailの基本2.1 Dockerの構成2.2 コンテナの起動・停止2.3 sailで使用できるコマンド3 Laravel Sailの設定3.1 ポートフォワードの設定 ...

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

laravel logo

Inertia使ってみた①

1 はじめに2 Inertiaとは3 ルーティング4 LaravelからReactに値渡し5 レスポンス5.1 初回5.2 page object5.3 2回目以降5.4 リロード時6 さいごに7 お ...

Stripe Connectでダイレクト支払い導入編

1 はじめに2 事前準備3 StripeConnectの導入3.1 stripeパッケージの導入3.2 envの実装4 店舗アカウントの登録4.1 Stripe Connectの設定4.2 Oauth ...

フォロー

blog-page_side_responsive

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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