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


関連記事

Go言語

Go言語の基礎〜基本構文その2〜

1 はじめに2 配列3 スライス3.1 スライスの宣言3.2 len3.3 append3.4 range3.5 値の切り出し3.6 可変長引数4 map4.1 宣言と初期化4.2 マップの操作4.3 ...

rails

Rails5.2+Pumaのデプロイ設定

1 はじめに1.1 環境2 Pumaとは?2.1 Unicornとの比較2.2 Pumaのスレッド3 Pumaの使い方4 デプロイ設定4.1 Gemを追加4.2 Capfileの設定4.3 deplo ...

laravel logo

LaravelでのDB操作の基礎

1 はじめに2 Eloquent2.1 モデルの定義2.2 モデルの取得2.3 モデルの追加2.4 モデルの更新2.5 モデルの削除2.6 クエリスコープ3 マイグレーション3.1 マイグレーションフ ...

rails

RailsでSidekiqを使ってみた

1 はじめに1.1 実行環境2 前準備2.1 Redisのインストール3 Railsの準備3.1 プロジェクト作成3.2 新規登録時にAPIを叩く4 Sidekiqの準備4.1 Workerを作る5 ...

icon

PHP、Ruby、Pythonのfor構文を比較してみた

1 はじめに1.1 環境2 ドキュメント2.1 PHP2.2 Ruby2.3 Python3 1から100まで出力してみる3.1 PHP3.2 Ruby3.3 Python4 リスト型(配列)の出力4 ...

フォロー

blog-page_side_responsive

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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