Dalam Go, melaksanakan penjana menggunakan hasil biasanya dicapai melalui gabungan goroutin dan saluran. Fungsi penjana mencipta goroutine yang menghasilkan nilai melalui saluran dan fungsi pengguna menerima nilai tersebut daripada saluran dalam gelung untuk julat.
Menurut Pergi idiom, tanggungjawab untuk menutup saluran jatuh pada fungsi penjana. Memandangkan penjana mempunyai pengetahuan apabila lelaran selesai, ia harus menutup saluran untuk memberi isyarat kepada pengguna bahawa tiada lagi nilai akan diterima.
Dalam kod anda yang diubah suai, anda telah meletakkan tanggungjawab dengan betul untuk menutup saluran pada pemanggil dengan tidak menutupnya dalam fungsi penjana. Walau bagaimanapun, anda juga harus mengalih keluar panggilan close() dalam fungsi main(), kerana ia adalah salah untuk menutup saluran yang telah ditutup.
package main import ( "./lib" "fmt" ) var ( fruits = []string{"apple", "banana", "cherry", "durian"} banned = "durian" ) func main() { channel := lib.PermutateWithChannel(fruits) defer close(channel) // Defer closing the channel for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { break // Break from the loop instead of closing the channel } } }
Apabila pemanggil menutup saluran, sebarang percubaan seterusnya untuk menghantar nilai kepadanya akan mengakibatkan panik masa jalan. Ini kerana saluran itu ditandakan sebagai ditutup dan menghantar ke saluran tertutup adalah haram. Walau bagaimanapun, panik ini tidak mempunyai sebarang kesan sampingan negatif selain menamatkan goroutine yang cuba menghantar nilai.
Untuk menyekat saluran yang dikembalikan oleh fungsi perpustakaan untuk menerima -sahaja, sambil masih membenarkan pemanggil menutupnya, anda boleh memperkenalkan jenis baharu yang membungkus saluran dan mendedahkan hanya menerima sahaja saluran:
type ReceiveOnlyChannel <-chan []string func NewReceiveOnlyChannel(channel <-chan []string) *ReceiveOnlyChannel { return (*ReceiveOnlyChannel)(&channel) } func PermutateWithChannel(strings []string) *ReceiveOnlyChannel { // ... (same as before, except it returns ReceiveOnlyChannel) }
Dengan membalut saluran dalam jenis baharu, anda boleh menyekat kebolehcapaiannya untuk hanya menerima operasi sambil masih membenarkan pemanggil menutupnya melalui kaedah Tutup() jenis pembalut.
Atas ialah kandungan terperinci Bagaimanakah Tanggungjawab Menutup Saluran dalam Penjana Go Dikendalikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!