Mari kita lihat corak kipas masuk. Ini sangat berguna apabila kami mempunyai data berkaitan daripada berbilang urutan yang perlu kami kumpulkan.
Sebagai contoh, katakan anda telah membuat beberapa panggilan API ke perkhidmatan yang berbeza dan anda perlu menggabungkan hasilnya.
Ini adalah corak yang sangat mudah untuk dilaksanakan, tetapi anda perlu memberi perhatian kepada cara anda mengendalikan saluran. Mudah mendapat keadaan buntu.
// produce is used to simulate the different data sources func produce(id int) chan int { ch := make(chan int) go func() { for i := 0; i < 10; i++ { ch <- id*10 + i } fmt.Printf("producer %d done\n", id) close(ch) // this is important!!! }() return ch } func fanin(inputs ...chan int) chan int { output := make(chan int) var wg sync.WaitGroup for i, input := range inputs { wg.Add(1) go func() { for value := range input { output <- value } fmt.Printf("done merging source %d\n", i) wg.Done() }() } go func() { wg.Wait() close(output) // this is important!!! }() return output } func main() { input1 := produce(0) input2 := produce(1) result := fanin(input1, input2) done := make(chan bool) go func() { for value := range result { fmt.Printf("got %d\n", value) } close(done) }() <-done fmt.Println("done") }
Di sini kami menggunakan fungsi menghasilkan untuk mensimulasikan sumber yang berbeza. Saluran sumber ini dihantar ke fungsi fanin yang menjalankan operasi penggabungan.
Fungsi fanin mencipta saluran output, kemudian melancarkan goroutine yang beroperasi pada setiap input. Kami menggunakan WaitGroup untuk menunjukkan apabila semua sumber input telah digabungkan ke dalam saluran output.
Dalam contoh mudah ini, utas utama hanya berulang pada output. Perhatikan bahawa tiada jaminan pada pesanan, nilai daripada 2 input bercampur.
Perkara penting yang perlu dikemukakan ialah kita perlu menutup saluran keluaran apabila kita selesai menggabungkan input. Operator julat akan menunggu selama-lamanya setelah saluran kosong. Ulas baris tutup(output) dan anda akan melihat bahawa anda mendapat keadaan buntu.
Bagaimana kita boleh memperbaiki perkara ini? Tinggalkan saya komen di bawah.
Terima kasih!
Kod untuk siaran ini dan semua siaran dalam siri ini boleh didapati di sini
Atas ialah kandungan terperinci Corak Fanin dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!