Bolehkah Go Channels Meniru Penjana Python?

DDD
Lepaskan: 2024-11-12 11:56:02
asal
283 orang telah melayarinya

Can Go Channels Mimic Python Generators?

Penjana Gaya Python dalam Go

Dalam Go, goroutine boleh digunakan seperti penjana Python, seperti yang ditunjukkan dalam Soalan 66 Tour of Pergi. Kod yang disediakan menulis semula Soalan 66 dengan cara yang dipermudahkan:

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)
    }
}
Salin selepas log masuk

Analisis

  1. Meningkatkan saiz penimbal saluran akan menghasilkan peningkatan prestasi akibat pengurangan penukaran konteks. Walau bagaimanapun, ini melibatkan kos peningkatan penggunaan memori.
  2. Kebocoran memori berlaku apabila goroutin tidak dikumpul sampah. Dalam kod yang disediakan, goroutine fibonacci kekal selama-lamanya, menghalang saluran c daripada dikumpul sampah.

Pendekatan Alternatif

Untuk menangani isu ini, pertimbangkan kod berikut:

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)
    }
}
Salin selepas log masuk

Dalam ini contoh:

  • Fungsi fib mengembalikan saluran, membenarkan pemanggil mengakses nombor Fibonacci secara berulang sehingga had yang ditentukan.
  • Groutine fibonacci menutup saluran apabila ia sampai ke penghujung, memastikan kebocoran memori tidak berlaku.

Atas ialah kandungan terperinci Bolehkah Go Channels Meniru Penjana Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan