Rumah >pembangunan bahagian belakang >Golang >Bolehkah Go Channels Meniru Penjana Python?

Bolehkah Go Channels Meniru Penjana Python?

DDD
DDDasal
2024-11-12 11:56:02404semak imbas

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)
    }
}

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)
    }
}

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!

Kenyataan:
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