Memahami Susunan Output Saluran di Golang
Pertimbangkan program Golang berikut:
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
Program ini melibatkan dua goroutin menulis secara tak segerak ke saluran dan bacaan rutin utama dari saluran yang sama. Walaupun saluran tidak buffer, output secara konsisten mencetak "ping" dan kemudian "hello."
Untuk memahami alasan di sebalik output ini, adalah penting untuk memahami bahawa susunan output saluran tidak berdasarkan susunan dalam yang mana goroutine dicipta. Sebaliknya, ia ditentukan oleh penjadual, yang memutuskan susunan pelaksanaan gorouti secara tidak pasti.
Apabila program dijalankan, kedua-dua gorout yang bertanggungjawab untuk menghantar mesej ke saluran berjalan serentak. Memandangkan saluran tidak dibuffer, kedua-dua gorouti disekat sehingga penerima tersedia.
Apabila rutin utama cuba membaca daripada saluran menggunakan msg := <-message, penjadual memberikan akses kepada salah satu gorouti yang menunggu . Goroutine ini berjaya menghantar mesej ke saluran, yang kemudiannya diterima oleh rutin utama dan diberikan kepada msg.
Seterusnya, apabila rutin utama cuba membaca dari saluran semula menggunakan msg2 := <-messages , penjadual memilih goroutine yang tinggal dan membenarkan ia menghantar mesejnya ke saluran. Mesej itu kemudiannya diambil oleh rutin utama dan diberikan kepada msg2.
Dalam kes ini, penjadual secara konsisten memilih "ping" penghantaran goroutine sebagai yang pertama menghantar mesejnya. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa hasil ini tidak menentukan dan boleh berubah berdasarkan faktor seperti beban sistem dan persekitaran pelaksanaan.
Ringkasnya, susunan output dalam saluran Golang tidak dijamin dan tertakluk kepada perintah pelaksanaan penjadual untuk goroutine. Oleh itu, walaupun contoh ini ringkas, output mungkin berbeza-beza pada pelaksanaan yang berbeza.
Atas ialah kandungan terperinci Mengapa Program Go Ini Mencetak 'ping' Kemudian 'hello' Walaupun Saluran Menulis Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!