Petunjuk atau Pembolehubah dalam Rujukan WaitGroups
Pakej penyegerakan menyediakan fungsi seperti Tambah, Selesai dan Tunggu untuk mengurus kumpulan tunggu. Adalah penting untuk memahami penggunaan penunjuk dan pembolehubah yang betul apabila bekerja dengan fungsi ini.
Kedua-dua fungsi Tambah dan Tunggu dipanggil menggunakan penuding kepada kumpulan tunggu, seperti yang ditunjukkan dalam pengisytiharan fungsinya. Ini adalah kelakuan yang dijangkakan kerana mereka mengubah suai keadaan dalaman kumpulan tunggu.
Walau bagaimanapun, fungsi Selesai mungkin kelihatan sebagai pengecualian dalam contoh kod berikut:
var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait()
Dalam kod ini, Fungsi selesai dipanggil menggunakan pembolehubah penunjuk (&wg). Ini mungkin membawa kepada kekeliruan kerana ia berbeza daripada penggunaan Tambah dan Tunggu.
Penjelasan terletak pada cara pembolehubah dihantar ke fungsi dalam Go. Apabila pembolehubah diluluskan sebagai hujah kepada fungsi, salinan nilainya dibuat. Dalam kes ini, jika fungsi Selesai dipanggil terus dengan wg (tanpa &), fungsi pekerja akan menerima salinan kumpulan tunggu. Sebarang perubahan yang dibuat dalam fungsi pekerja tidak akan menjejaskan contoh kumpulan tunggu asal dalam goroutine utama, yang akan menyebabkan isu penyegerakan.
Oleh itu, alamat kumpulan tunggu (&wg) perlu diserahkan kepada Selesai fungsi supaya fungsi pekerja mempunyai akses terus kepada contoh kumpulan tunggu asal dan boleh mengubah suai keadaan dalamannya dengan sewajarnya.
Ini juga menyerlahkan perbezaan antara penunjuk dan penerima nilai dalam Go. Fungsi penerima boleh ditakrifkan sebagai sama ada penerima penunjuk (*WaitGroup) atau penerima nilai (WaitGroup). Penerima penuding membenarkan fungsi mengubah suai nilai asas, manakala penerima nilai mencipta salinan pembolehubah, membenarkan fungsi beroperasi pada salinannya sendiri tanpa menjejaskan yang asal.
Dalam kes tertentu ini, anda perlu menggunakan penerima penunjuk untuk ketiga-tiga fungsi (Tambah, Selesai, Tunggu) kerana mereka semua perlu mengubah suai keadaan dalaman kumpulan tunggu. Walaupun Selesai nampaknya merupakan pengecualian, ia sebenarnya mengikut prinsip yang sama iaitu menyediakan akses terus kepada contoh kumpulan tunggu yang asal.
Atas ialah kandungan terperinci Patutkah Saya Menggunakan Penunjuk atau Pembolehubah dengan Fungsi Tambah, Selesai dan Tunggu Go\'s WaitGroup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!