Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Melaksanakan Penjana Rekursif secara Idiomatik dalam Go Using Channels?

Bagaimana untuk Melaksanakan Penjana Rekursif secara Idiomatik dalam Go Using Channels?

Susan Sarandon
Lepaskan: 2024-12-05 09:09:13
asal
871 orang telah melayarinya

How to Idiomatically Implement Recursive Generators in Go Using Channels?

Melaksanakan Penjana Secara Idiomatik dalam Go for Recursive Functions

Kod yang disediakan menunjukkan fungsi penjana rekursif menggunakan saluran untuk mensimulasikan hasil gaya Python.

Idiomatik Implementasi

Idiomatiknya, penjana dalam Go boleh dilaksanakan menggunakan goroutine dan saluran seperti berikut:

  • Gunakan fungsi tanpa nama untuk memulakan penjana sebagai goroutine: Ini membolehkan pengendalian yang betul untuk menutup saluran dan bertindak balas kepada isyarat daripada pengguna.
  • Minta penjana menangguhkan penutupan saluran: Ini memastikan saluran sentiasa ditutup, walaupun penjana panik.
  • Pertimbangkan untuk menggunakan saluran isyarat: Ini membolehkan pengguna berkomunikasi dengan penjana, mis., untuk meminta pengguguran.

Tanggungjawab Menutup Saluran

Idiomatiknya, fungsi penjana harus bertanggungjawab untuk menutup saluran. Ini memastikan saluran ditutup apabila penjana selesai menghantar semua nilai.

Kod Ubahsuai

Kod yang diubah suai boleh ditulis secara idiomatik sebagai berikut:

Perpustakaan

func permutateWithChannel(channel chan<- []string, strings, prefix []string) {
    defer close(channel)
    length := len(strings)
    if length == 0 {
        channel <- prefix
        return
    }
    newStrings := make([]string, 0, length-1)
    for i, s := range strings {
        newStringsI := append(newStrings, strings[:i]...)
        newStringsI = append(newStringsI, strings[i+1:]...)
        newPrefixI := append(prefix, s)
        go permutateWithChannel(channel, newStringsI, newPrefixI)
    }
}

func PermutateWithChannel(strings []string) chan []string {
    channel := make(chan []string)
    prefix := make([]string, 0, len(strings))
    go permutateWithChannel(channel, strings, prefix)
    return channel
}
Salin selepas log masuk

Pemanggil

func main() {
    channel := lib.PermutateWithChannel(fruits)
    for myFruits := range channel {
        fmt.Println(myFruits)
        if myFruits[0] == banned {
            return
        }
    }
}
Salin selepas log masuk

Goroutine Penamatan dan Panik

Menutup saluran selepas pengguna menutup ia tidak akan menyebabkan panik. Malah, cubaan menghantar nilai ke saluran tertutup akan mengakibatkan ralat saluran tertutup.

Saluran Terima Sahaja

Untuk mengehadkan fungsi perpustakaan kepada menerima sahaja, pendekatan idiomatik adalah menggunakan jenis saluran yang berasingan untuk menerima nilai dan menghantar isyarat. Dalam kes ini, fungsi perpustakaan akan mempunyai tandatangan berikut:

func PermutateWithChannel(strings []string) (<-chan []string, chan<- struct{})
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Penjana Rekursif secara Idiomatik dalam Go Using Channels?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan