Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Boleh sync.WaitGroup Kaedah Dipanggil pada Nilai Bukan Penunjuk?

Mengapa Boleh sync.WaitGroup Kaedah Dipanggil pada Nilai Bukan Penunjuk?

Linda Hamilton
Linda Hamiltonasal
2024-11-24 02:57:10578semak imbas

Why Can sync.WaitGroup Methods Be Called on Non-Pointer Values?

Kaedah Set penyegerakan.WaitGroup

Penyegerakan.WaitGroup ialah primitif penyegerakan yang membolehkan anda menunggu koleksi gorout selesai . Walaupun dokumentasinya mencadangkan bahawa kaedah Tambah, Selesai dan Tunggu memerlukan penerima penuding, anda juga boleh menggunakannya pada nilai bukan penuding. Bagaimanakah ini boleh berlaku?

Rahsianya terletak pada set kaedah penyegerakan kosong.WaitGroup. Ini bermakna semua kaedah penyegerakan.WaitGroup ialah penerima penunjuk. Apabila anda mencipta nilai jenis penyegerakan.WaitGroup, seperti:

var wg sync.WaitGroup

Anda sebenarnya sedang mencipta penuding kepada penyegerakan.WaitGroup struct. Penunjuk ini dinyahrujuk secara automatik apabila anda memanggil kaedah pada pembolehubah wg. Contohnya, kod berikut berjaya dikompilasi:

wg.Add(1)
wg.Done()
wg.Wait()

Pengkompil Go secara tersirat menukar wg kepada penuding untuk disegerakkan.WaitGroup sebelum memanggil kaedah. Tingkah laku ini ditakrifkan dalam spesifikasi bahasa Go:

Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m().

Oleh itu, anda boleh memanggil kaedah yang mempunyai penerima penunjuk pada nilai bukan penunjuk jika nilai tersebut boleh ditangani. Nilai bukan penuding sentiasa boleh ditangani dalam Go.

Atas ialah kandungan terperinci Mengapa Boleh sync.WaitGroup Kaedah Dipanggil pada Nilai Bukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn