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


関連記事

laravel logo

Laravelで認証APIを作る

1 はじめに1.1 条件1.2 JWTとは2 準備2.1 認証機能を有効化2.2 jwt-authのインストール2.3 コンフィグファイルの作成2.4 secretの作成3 Userモデルを修正4 g ...

Go言語

Go言語のエラーハンドリングとログローテーション

1 はじめに2 エラーハンドリング2.1 error インターフェース2.2 pkg/errors パッケージ3 独自のエラータイプ付き errorsパッケージを作成4 log パッケージ4.1 lo ...

docker-syncでファイルの同期を高速化する

1 はじめに2 docker-syncの導入3 設定ファイルの作成3.1 docker-composer.yml3.2 docker-compose-dev.yml3.3 docker-sync.ym ...

WebアプリからLINEのメッセージを送る方法

1 はじめに2 Messaging APIとは2.1 Messaging APIの仕組み2.2 Webhookイベント2.3 メッセージオブジェクトの種類2.4 料金形態3 LINE Develope ...

laravel logo

Laravelのコントローラの基礎

1 はじめに2 ルーティング2.1 使用可能なメソッド2.2 リダイレクト2.3 Viewの返却2.4 ルートパラメータ2.5 ミドルウェア2.6 プレフィックス3 バリデーション3.1 コントローラ ...

フォロー

blog-page_side_responsive

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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