Go Concurrency dan Kekeliruan Saluran
Masalah
Seorang pengguna cuba memahami Go concurrency dan saluran menggunakan coretan kod berikut:
<code class="go">package main import "fmt" func display(msg string, c chan bool) { fmt.Println("display first message:", msg) c <- true } func sum(c chan bool) { sum := 0 for i := 0; i < 10000000000; i++ { sum++ } fmt.Println(sum) c <- true } func main() { c := make(chan bool) go display("hello", c) go sum(c) <-c }</code>
Output yang dijangkakan hanyalah "paparkan mesej pertama: hello" kerana fungsi utama harus keluar sebaik sahaja ia menerima data daripada saluran. Walau bagaimanapun, output sebenar juga termasuk jumlah 10 bilion nombor.
Jawapan
Isu utama dalam kod ialah penjadual boleh memilih secara bebas antara dua goroutine (paparan dan jumlah) yang tidak disekat. Walaupun pengaturcara menjangkakan paparan akan selesai dahulu dan menghantar data ke saluran sebelum jumlah selesai, ini mungkin tidak berlaku kerana sifat penjadual yang tidak menentukan.
Dalam satu kemungkinan senario pelaksanaan:
Untuk menangani isu ini dan memastikan bahawa mesej "paparkan mesej pertama: hello" dicetak secara eksklusif, satu pendekatan ialah menggunakan saluran hasil untuk menerima mesej daripada paparan dan menamatkan program dengan serta-merta. Fungsi utama yang diubah suai ialah:
<code class="go">func main() { result := make(chan string) go display("hello", result) fmt.Println(<-result) }</code>
Atas ialah kandungan terperinci Mengapakah kod Go saya mencetak jumlah 10 bilion nombor dan bukannya hanya \'paparkan mesej pertama: hello\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!