Go memperkenalkan konsep saluran terkumpul, membenarkan saluran menerima mesej tanpa menyekat sehingga penimbal diisi. Ini menimbulkan persoalan: bolehkah corak serupa digunakan pada mekanisme penguncian, mewujudkan "kunci penampan" yang menyekat akses sumber kepada bilangan pelanggan tertentu?
Yang primitif direka untuk mengurus akses kepada sumber yang dikongsi sambil mengehadkan konkurensi pelanggan dikenali sebagai semaphore. Dalam Go, semaphore boleh dilaksanakan dengan mudah menggunakan saluran penimbal.
Pertimbangkan coretan kod berikut:
var semaphore = make(chan struct{}, 4) // limit to 4 concurrent users func f() { // Acquire the lock. Blocks until at most 3 other goroutines are already executing f. semaphore <- struct{}{} // Release the lock when done. defer func() { <-semaphore }() // Perform the protected work... }
Di sini, semafor diwakili oleh saluran penimbal bersaiz 4, yang membenarkan sehingga empat seruan serentak fungsi f. Operasi <-semaphore mendapatkan semula nilai daripada saluran, menyekat sehingga satu menjadi tersedia. Operasi <-semaphore mengeluarkan nilai semula ke dalam saluran, membenarkan goroutine lain memperoleh kunci.
Semaphore menyediakan mekanisme yang mudah dan berkesan untuk melaksanakan penguncian buffer dalam Go, membolehkan akses terkawal kepada sumber yang dikongsi oleh bilangan pelanggan yang terhad.
Atas ialah kandungan terperinci Bolehkah Anda Mencipta 'Kunci Penampan' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!