Go で Python スタイルのジェネレーターを実装するにはどうすればよいですか?

DDD
リリース: 2024-11-19 11:25:03
オリジナル
841 人が閲覧しました

How Can I Implement Python-Style Generators in Go?

Go の Python スタイルのジェネレーター

実装

Python では、ジェネレーターはイテレーターを作成するための便利な構造です。 Go のゴルーチンも同様の機能を提供します。以下は、フィボナッチ数列の Python スタイル ジェネレーターの Go 実装です。

package main

import "fmt"

// Fibonacci generates the Fibonacci sequence into a channel.
func fibonacci(c chan int) {
    x, y := 1, 1

    for {
        c <- x
        x, y = y, x+y
    }
}

func main() {
    c := make(chan int)
    go fibonacci(c)

    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
}
ログイン後にコピー

パフォーマンスとメモリ管理

バッファ サイズ:

増加チャネルのバッファ サイズ (たとえば、10 に) を設定すると、コンテキストの切り替えが減り、パフォーマンスが向上する可能性があります。ただし、これにはメモリ消費が犠牲になります。

メモリ管理:

上記のコードでは、フィボナッチ ゴルーチンは無限に実行され、チャネル c からの読み取りを待機します。 。チャネル c が閉じられていないため、メモリ リークが発生します。これに対処する代替実装を次に示します。

func fib(n int) chan int {
    c := make(chan int)
    go func() {
        x, y := 0, 1
        for i := 0; i <= n; i++ {
            c <- x
            x, y = y, x+y
        }
        close(c)
    }()
    return c
}
ログイン後にコピー

この場合、n 個のフィボナッチ数が生成されたときにゴルーチンは終了します。チャネルが閉じられると、ガベージ コレクターによってクリーンアップされます。

その他の考慮事項

生成された値の数が不明なシナリオでは、ジェネレーターのゴルーチンに信号を送信するために別の終了チャネルを使用することを検討してください。いつ止めるか。これについては、Golang チュートリアルで説明されています: https://tour.golang.org/concurrency/4.

以上がGo で Python スタイルのジェネレーターを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート