Dalam Python, penjana ialah binaan yang mudah untuk mencipta iterator. Goroutines dalam Go menawarkan kefungsian yang serupa. Berikut ialah pelaksanaan Go bagi penjana gaya Python untuk jujukan Fibonacci:
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) } }
Saiz Penampan:
Meningkatkan saiz penimbal saluran (cth., hingga 10) berkemungkinan akan meningkatkan prestasi dengan mengurangkan suis konteks. Walau bagaimanapun, ini mengorbankan penggunaan memori.
Pengurusan Memori:
Dalam kod di atas, goroutine fibonacci berjalan selama-lamanya, menunggu bacaan daripada saluran c . Saluran c tidak ditutup, membawa kepada kebocoran memori. Berikut ialah pelaksanaan alternatif yang menangani perkara ini:
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 }
Dalam kes ini, goroutine ditamatkan apabila n nombor Fibonacci telah dijana. Saluran ditutup, mengakibatkan pembersihannya oleh pemungut sampah.
Untuk senario di mana bilangan nilai yang dijana tidak diketahui, pertimbangkan untuk menggunakan saluran berhenti yang berasingan untuk memberi isyarat kepada goroutine penjana bila nak berhenti. Ini diterangkan dalam tutorial Golang: https://tour.golang.org/concurrency/4.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Penjana Gaya Python dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!