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