首頁  >  文章  >  後端開發  >  如何在 Go 中實作 Python 風格的生成器?

如何在 Go 中實作 Python 風格的生成器?

DDD
DDD原創
2024-11-19 11:25:03836瀏覽

How Can I Implement Python-Style Generators in Go?

Go 中的 Python 風格產生器

實作

在 Python 中,產生器是建立迭代器的便利構造。 Go 中的 Goroutines 提供類似的功能。這是斐波那契數列的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)可能會透過減少上下文切換來提高效能。然而,這是以記憶體消耗為代價的。

記憶體管理:

在上面的程式碼中,斐波那契 goroutine 無限期地運行,等待來自通道 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
}

在這種情況下,goroutine 在產生 n 個斐波那契數時終止。通道關閉,導致其被垃圾收集器清理。

其他注意事項

對於生成值數量未知的場景,請考慮使用單獨的退出通道向生成器 goroutine 發出信號什麼時候停止。 Golang 教學對此進行了描述:https://tour.golang.org/concurrency/4。

以上是如何在 Go 中實作 Python 風格的生成器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn