首頁 > 後端開發 > Golang > 主體

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

DDD
發布: 2024-11-12 11:56:02
原創
283 人瀏覽過

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函數傳回一個通道,允許呼叫者迭代存取達到指定限制的斐波那契數。
  • 斐波那契協程到達末端時會關閉通道,確保不會發生記憶體洩漏。

以上是Go Channels 可以模仿 Python 生成器嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板