Saluran tidak buffer di Golang memperkenalkan aspek menarik pengaturcaraan serentak di mana susunan penghantaran mesej daripada pengirim kepada penerima boleh menjadi tidak dapat diramalkan. Mari kita terokai sebab menggunakan contoh kod khusus dan analisisnya.
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) // "ping" fmt.Println(msg2) // "hello" }
Memandangkan kedua-dua gorout pengirim berjalan serentak, tiada jaminan tentang mesej manakah yang dihantar dahulu ke dalam saluran. Dalam kod khusus ini, anda sentiasa memerhatikan bahawa "ping" dicetak dahulu dan "hello" kedua. Ini disebabkan oleh sifat penjadualan goroutine yang tidak ditentukan di Golang.
Groutine di Golang dijadualkan mengikut masa larian, yang bermaksud susunan pelaksanaannya tidak dapat diramalkan. Ini merupakan aspek penting dalam pengaturcaraan serentak di mana ketersediaan teras, algoritma penjadualan benang dan sifat kod anda boleh mempengaruhi susunan pelaksanaan.
Untuk menggambarkan bukan ini -determinisme selanjutnya, pertimbangkan untuk mengubah suai kod untuk mencetak mesej daripada pengirim goroutine:
func main() { messages := make(chan string) // Print before writing to the channel go func() { fmt.Println("Sending hello"); messages <- "hello" }() go func() { fmt.Println("Sending ping"); messages <- "ping" }() // Receive messages and print msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
Dalam kod yang diubah suai ini, anda mungkin melihat susunan output berikut:
Sending hello Sending ping ping hello
Ini menunjukkan bahawa goroutine yang menghantar "hello" dijadualkan untuk pelaksanaan dan menulis kepada saluran sebelum goroutine yang menghantar "ping," walaupun "ping" diterima dan dicetak terlebih dahulu dalam utama rutin.
Saluran tidak buffer di Golang tidak menjamin susunan penghantaran mesej. Susunan penerimaan mesej bergantung pada sifat bukan penentu penjadualan goroutine dalam masa jalan. Untuk mengelakkan sebarang kemungkinan kekeliruan, adalah penting untuk memahami bukan penentuan ini dan mengambil langkah yang sewajarnya apabila perlu.
Atas ialah kandungan terperinci Mengapa Pesanan Output Tidak Dapat Diramalkan dalam Saluran Tidak Dibuffer Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!