検索
ホームページバックエンド開発GolangGo のイテレータを理解する: 楽しいダイビング!

Understanding Iterators in Go: A Fun Dive!

Go プログラマーであれば、おそらく Go 1.22、特に Go 1.23 でイテレーターについて何度も聞いたことがあるでしょう。 。しかし、なぜそれらが役立つのか、いつ使用する必要があるのか​​、まだ頭を悩ませているかもしれません。そうですね、あなたは正しい場所にいます!まずは、Go でイテレータがどのように機能するのか、そしてなぜイテレータが非常に役立つのかを見てみましょう。

単純な変換: イテレータはまだありません

数値のリストがあり、それぞれの数値を 2 倍にしたいと想像してください。以下のような簡単な関数を使用してこれを行うことができます:

package main

import (
    "fmt"
)

func NormalTransform[T1, T2 any](list []T1, transform func(T1) T2) []T2 {
    transformed := make([]T2, len(list))

    for i, t := range list {
        transformed[i] = transform(t)
    }

    return transformed
}

func main() {
    list := []int{1, 2, 3, 4, 5}
    doubleFunc := func(i int) int { return i * 2 }

    for i, num := range NormalTransform(list, doubleFunc) {
        fmt.Println(i, num)
    }
}

このコードを実行すると、次のことが起こります:

0 2
1 4
2 6
3 8
4 10

とてもシンプルですよね?これは基本的な汎用 Go 関数で、任意の型 T1 のリストを受け取り、各要素に変換関数を適用して、任意の型 T2 の変換されたリストを含む新しいリストを返します。 Goジェネリックを知っていれば簡単に理解できます!

しかし、これを処理する別の方法、つまりイテレータを使用する方法があると言ったらどうなるでしょうか?

イテレータを入力してください!

ここで、同じ変換にイテレータを使用する方法を見てみましょう:

package main

import (
    "fmt"
)

func IteratorTransform[T1, T2 any](list []T1, transform func(T1) T2) iter.Seq2[int, T2] {
    return func(yield func(int, T2) bool) {
        for i, t := range list {
            if !yield(i, transform(t)) {
                return
            }
        }
    }
}

func main() {
    list := []int{1, 2, 3, 4, 5}
    doubleFunc := func(i int) int { return i * 2 }

    for i, num := range NormalTransform(list, doubleFunc) {
        fmt.Println(i, num)
    }
}

実行する前に、Go のバージョンが 1.23 であることを確認する必要があります。出力はまったく同じです:

0 2
1 4
2 6
3 8
4 10

しかし、待ってください、なぜここでイテレータが必要なのでしょうか?それはもっと複雑ではないでしょうか?違いを詳しく見てみましょう。

イテレータを使用する理由

一見すると、イテレーターは、リストの変換のような単純なことに対して少し過剰設計されているように見えます。しかし、ベンチマークを実行すると、ベンチマークを検討する価値がある理由が分かり始めます!

両方のメソッドをベンチマークして、そのパフォーマンスを確認してみましょう:

package main

import (
    "testing"
)

var (
    transform = func(i int) int { return i * 2 }
    list      = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
)

func BenchmarkNormalTransform(b *testing.B) {
    for i := 0; i 



<p>最初のベンチマーク結果は次のとおりです:<br>
</p>

<pre class="brush:php;toolbar:false">BenchmarkNormalTransform-8      41292933                29.49 ns/op
BenchmarkIteratorTransform-8    1000000000               0.3135 ns/op

おお!それは大きな違いです!しかし、ちょっと待ってください。ここには少し不公平があります。 NormalTransform 関数は完全に変換されたリストを返しますが、IteratorTransform 関数はリストをまだ変換せずに反復子を設定するだけです。

イテレータを完全にループして公平にしましょう:

func BenchmarkIteratorTransform(b *testing.B) {
    for i := 0; i 



<p>結果はより合理的になりました:<br>
</p>

<pre class="brush:php;toolbar:false">BenchmarkNormalTransform-8      40758822                29.16 ns/op
BenchmarkIteratorTransform-8    53967146                22.39 ns/op

わかりました、イテレーターは少し高速です。なぜ? NormalTransform は、変換されたリスト全体をメモリ (ヒープ上) に作成してから返しますが、反復子はループ処理中に変換を実行するため、時間とメモリが節約されます。

スタックとヒープ について詳しくは、こちらをご覧ください

イテレータの本当の魔法は、リスト全体を処理する必要がないときに起こります。リストを変換した後に数字の 4 だけを見つけたいというシナリオのベンチマークを行ってみましょう:

func BenchmarkNormalTransform(b *testing.B) {
    for i := 0; i 



結果がすべてを物語っています:

package main

import (
    "fmt"
)

func NormalTransform[T1, T2 any](list []T1, transform func(T1) T2) []T2 {
    transformed := make([]T2, len(list))

    for i, t := range list {
        transformed[i] = transform(t)
    }

    return transformed
}

func main() {
    list := []int{1, 2, 3, 4, 5}
    doubleFunc := func(i int) int { return i * 2 }

    for i, num := range NormalTransform(list, doubleFunc) {
        fmt.Println(i, num)
    }
}

この場合、反復子ははるかに高速です。なぜ?イテレーターはリスト全体を変換するわけではないため、探している結果が見つかるとすぐに停止します。一方、NormalTransform は、たとえ 1 つの項目だけを対象としても、リスト全体を変換します。

結論: イテレータをいつ使用するか?

それでは、なぜ Go でイテレータを使用するのでしょうか?

  • 効率: イテレータは、必要がない場合にリスト全体を処理しないことで、時間とメモリの両方を節約できます。
  • 柔軟性: 特にデータのストリームを扱う場合や早期に停止する必要がある場合に、大規模なデータセットを効率的に処理できるようになります。 ただし、イテレーターは理解して実装するのが少し難しい場合があることに注意してください。追加のパフォーマンス向上が必要な場合、特にリスト全体を事前に処理する必要がないシナリオでこれらを使用してください。

イテレーター: コツを掴めば、高速かつ柔軟で楽しいです!

以上がGo のイテレータを理解する: 楽しいダイビング!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Golang and Python:違いを理解するGolang and Python:違いを理解するApr 18, 2025 am 12:21 AM

GolangとPythonの主な違いは、並行性モデル、タイプシステム、パフォーマンス、実行速度です。 1. GolangはCSPモデルを使用します。これは、同時タスクの高いタスクに適しています。 Pythonは、I/O集約型タスクに適したマルチスレッドとGILに依存しています。 2。Golangは静的なタイプで、Pythonは動的なタイプです。 3.ゴーランコンパイルされた言語実行速度は高速であり、Python解釈言語開発は高速です。

Golang vs. C:速度差の評価Golang vs. C:速度差の評価Apr 18, 2025 am 12:20 AM

Golangは通常Cよりも遅くなりますが、Golangはプログラミングと開発効率の同時により多くの利点があります。1)Golangのゴミ収集と並行性モデルにより、同時性の高いシナリオではうまく機能します。 2)Cは、手動のメモリ管理とハードウェアの最適化により、より高いパフォーマンスを取得しますが、開発の複雑さが高くなります。

Golang:クラウドコンピューティングとDevOpsのキー言語Golang:クラウドコンピューティングとDevOpsのキー言語Apr 18, 2025 am 12:18 AM

GolangはクラウドコンピューティングとDevOpsで広く使用されており、その利点はシンプルさ、効率性、および同時プログラミング機能にあります。 1)クラウドコンピューティングでは、GolangはGoroutineおよびチャネルメカニズムを介して同時リクエストを効率的に処理します。 2)DevOpsでは、Golangの高速コンピレーションとクロスプラットフォーム機能により、自動化ツールの最初の選択肢になります。

Golang and C:実行効率の理解Golang and C:実行効率の理解Apr 18, 2025 am 12:16 AM

GolangとCにはそれぞれ、パフォーマンス効率に独自の利点があります。 1)GolangはGoroutineおよびGarbage Collectionを通じて効率を向上させますが、一時停止時間を導入する場合があります。 2)Cは、手動のメモリ管理と最適化を通じて高性能を実現しますが、開発者はメモリリークやその他の問題に対処する必要があります。選択するときは、プロジェクトの要件とチームテクノロジースタックを考慮する必要があります。

Golang vs. Python:並行性とマルチスレッドGolang vs. Python:並行性とマルチスレッドApr 17, 2025 am 12:20 AM

Golangは高い並行性タスクにより適していますが、Pythonには柔軟性がより多くの利点があります。 1.Golangは、GoroutineとChannelを介して並行性を効率的に処理します。 2。Pythonは、GILの影響を受けるが、複数の並行性メソッドを提供するスレッドとAsyncioに依存しています。選択は、特定のニーズに基づいている必要があります。

GolangとC:パフォーマンスのトレードオフGolangとC:パフォーマンスのトレードオフApr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

Golang vs. Python:アプリケーションとユースケースGolang vs. Python:アプリケーションとユースケースApr 17, 2025 am 12:17 AM

seetgolangforhighperformance andconcurrency、ithyforbackendservicesandnetworkプログラミング、selectthonforrapiddevelopment、datascience、andmachinelearningduetoistsversitydextentextensextensentensiveLibraries。

Golang vs. Python:重要な違​​いと類似点Golang vs. Python:重要な違​​いと類似点Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。