Kod yang disediakan menunjukkan fungsi penjana rekursif menggunakan saluran untuk mensimulasikan hasil gaya Python.
Idiomatiknya, penjana dalam Go boleh dilaksanakan menggunakan goroutine dan saluran seperti berikut:
Idiomatiknya, fungsi penjana harus bertanggungjawab untuk menutup saluran. Ini memastikan saluran ditutup apabila penjana selesai menghantar semua nilai.
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 }
Pemanggil
func main() { channel := lib.PermutateWithChannel(fruits) for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { return } } }
Menutup saluran selepas pengguna menutup ia tidak akan menyebabkan panik. Malah, cubaan menghantar nilai ke saluran tertutup akan mengakibatkan ralat saluran tertutup.
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{})
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!