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 サイトの他の関連記事を参照してください。