在 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中文網其他相關文章!