Tuding atau Pembolehubah dalam Rujukan WaitGroups
Dalam pakej penyegerakan, fungsi Tambah, Selesai dan Tunggu untuk WaitGroups semuanya dipanggil oleh penunjuk ke WaitGroup. Walau bagaimanapun, kod berikut nampaknya bercanggah dengan konvensyen ini:
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() }
Dalam kod ini, manakala Selesai dipanggil menggunakan pembolehubah penunjuk, Tambah dan Tunggu dipanggil menggunakan pembolehubah (bukan penunjuk).
Penjelasan:
Walaupun pengisytiharan berubah-ubah var wg sync.WaitGroup, fungsi Tambah, Selesai dan Tunggu diakses melalui penerima penudingnya (*WaitGroup). Nilai wg ditukar secara tersirat kepada penunjuk oleh pengkompil Go. Ini adalah perlu kerana kaedah ditakrifkan sebagai penerima penunjuk, seperti yang dilihat dalam pengisytiharan fungsi:
Add -------> func (wg *WaitGroup) Add(delta int) Done ------> func (wg *WaitGroup) Done() Wait ------> func (wg *WaitGroup) Wait()
Apabila menghantar nilai bukan penunjuk kepada kaedah penerima penunjuk, pengkompil secara automatik mengambil alamatnya (penunjuk kepada nilai). Oleh itu, walaupun wg diisytiharkan sebagai pembolehubah, ketiga-tiga fungsi masih dipanggil pada penunjuk ke wg.
Sebab utama menggunakan penerima penunjuk adalah untuk mengelakkan penyalinan data yang tidak perlu. Dengan menghantar penunjuk, fungsi boleh mengubah suai WaitGroup yang mendasari secara langsung, dan bukannya membuat salinannya. Ini meningkatkan prestasi, terutamanya untuk WaitGroups yang kerap diubah suai.
Dalam kod yang disediakan, adalah penting untuk menghantar alamat wg kepada pekerja kerana jika ia dihantar sebagai nilai (tanpa &), fungsi Done dalam setiap pekerja akan merujuk kepada penunjuk yang berbeza daripada Tambah dan Tunggu dalam fungsi utama. Ini akan mengakibatkan tingkah laku yang salah.
Atas ialah kandungan terperinci Mengapakah fungsi Tambah, Selesai dan Tunggu WaitGroup dipanggil menggunakan penuding walaupun apabila diisytiharkan sebagai pembolehubah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!