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)

この内、 k と v は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


関連記事

laravel logo

Laravel Authのパスワードリセット機能をカスタマイズする

はじめに こんにちは。Laravelには標準の認証機能Authが用意されており、その中にはパスワードリセット機能が最初から含まれています。 メールアドレスを入力するとメールが送信され、メール本文内のU ...

rails

Rails Developer Meetup に参加してきました【1日目】

はじめに 3月24日、25日に開催された、Rails Developer Meetup に参加させていただきました。 多くの発表を聞くことができ、とても有意義な時間を過ごすことができました。 本日は、 ...

rails

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

laravel logo

LaravelでHTTP通信

はじめに 外部サーバとの連携など、HTTPリクエストを投げたいケースが有るとおもいます。今回は Guzzle を使ってHTTPリクエストを投げる方法を紹介します。 インストール ルートディレクトリで以 ...

Go言語

Go 1.24で追加されたweak pointer

はじめに 前回の記事では、Go 1.24での変更点についていくつか列挙し、その中でomitzeroタグについて紹介しました。 今回はその続きとして、weak pointerに付いて書きたいと思います。 ...

フォロー

blog-page_side_responsive

2024年9月
日 月 火 水 木 金 土
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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