Nilai Tidak Dijangka daripada Saluran Tertutup
Dalam Go, saluran ialah primitif komunikasi yang berkuasa yang memudahkan pertukaran data antara goroutine. Walau bagaimanapun, tingkah laku mereka kadangkala boleh mengelirukan, terutamanya mengenai saluran tertutup.
Soalan:
Pemaju menghadapi gelagat yang tidak dijangka apabila cuba membaca nilai daripada saluran tertutup. Walaupun saluran ditutup secara eksplisit, mereka terus menerima nilai daripada pernyataan julat. Timbul persoalan: kenapa?
Penjelasan:
Menurut Spesifikasi Bahasa Pengaturcaraan Go, menutup saluran membayangkan bahawa tiada nilai lanjut akan dihantar. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa sebarang nilai yang dihantar sebelum ini masih boleh diterima. Spesifikasi menyatakan bahawa selepas memanggil tutup, "menerima operasi akan mengembalikan nilai sifar untuk jenis saluran tanpa menyekat."
Contoh:
Dalam sampel kod yang disediakan, goroutine dihasilkan untuk menghantar nilai ke dalam saluran. Selepas semua nilai telah dihantar, saluran ditutup menggunakan fungsi close(). Pernyataan julat kemudiannya digunakan untuk mengulang nilai saluran.
Gelagat Tidak Dijangka:
Walaupun saluran ditutup, pernyataan julat berulang melalui kesemua 5 nilai yang dihantar . Ini berlaku kerana masih terdapat 5 nilai yang dihantar sebelum ini dalam penimbal saluran sebelum ia ditutup. Fungsi close() tidak segera mengalih keluar nilai ini; sebaliknya, ia memberi isyarat bahawa tiada lagi nilai akan dihantar.
Penyelesaian:
Untuk memastikan tiada nilai diterima selepas menutup saluran, adalah penting untuk menunggu untuk semua operasi terima tertunggak untuk diselesaikan. Ini boleh dicapai dengan menggunakan mekanisme penyegerakan, seperti WaitGroup, untuk menunggu semua goroutine yang mungkin menghantar nilai ke saluran selesai.
Nota Tambahan:
Helah "masa.Tidur" yang digunakan dalam sampel kod asal bertujuan untuk memberi masa untuk semua goroutine selesai dan saluran ditutup sebelum mengulangi nilainya. Walau bagaimanapun, pendekatan ini tidak boleh dipercayai kerana ia bergantung pada masa tidur yang sewenang-wenangnya. Sebaliknya, bergantung pada mekanisme penyegerakan adalah lebih mantap.
Atas ialah kandungan terperinci Mengapa Saya Masih Menerima Nilai daripada Saluran Go Tertutup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!