首页 > 后端开发 > Golang > 正文

Go Channels 可以模仿 Python 生成器吗?

DDD
发布: 2024-11-12 11:56:02
原创
281 人浏览过

Can Go Channels Mimic Python Generators?

Go 中的 Python 风格的生成器

在 Go 中,goroutines 可以像 Python 生成器一样使用,如问题 66 中的示例去。提供的代码以简化的方式重写了问题 66:

package main

import "fmt"

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)
    }
}
登录后复制

分析

  1. 增加通道的缓冲区大小将导致性能提升,因为通道的缓冲区大小会减少上下文切换。然而,这是以增加内存使用为代价的。
  2. 当 goroutine 没有被垃圾回收时,就会发生内存泄漏。在提供的代码中,斐波那契 goroutine 无限期地持续存在,从而防止通道 c 被垃圾收集。

替代方法

要解决这些问题,请考虑以下代码:

package main

import "fmt"

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
}

func main() {
    for i := range fib(10) {
        fmt.Println(i)
    }
}
登录后复制

在此示例:

  • fib 函数返回一个通道,允许调用者迭代访问斐波那契数,直到指定的限制。
  • 斐波那契 goroutine 在到达末尾时关闭通道,确保不会发生内存泄漏。

以上是Go Channels 可以模仿 Python 生成器吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板