Mengapa sync.WaitGroup Berfungsi Tanpa Penerima Penunjuk?
Dalam Go, jenis sync.WaitGroup digunakan untuk menyegerakkan goroutin. Kaedah penyegerakan.WaitGroup, seperti Tambah, Selesai dan Tunggu, ditakrifkan dengan penerima penunjuk. Walau bagaimanapun, adalah perkara biasa untuk mengisytiharkan penyegerakan. Nilai WaitGroup tanpa penuding (*).
Pertimbangkan coretan berikut:
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { wg.Add(1) go func() { fmt.Println("starting...") time.Sleep(1 * time.Second) fmt.Println("done....") wg.Done() }() wg.Wait() }
Dalam kod ini, kami mengisytiharkan wg sebagai penyegerakan.WaitGroup nilai tanpa penunjuk (*). Ini mungkin kerana Go membenarkan penggunaan penerima penuding pada nilai bukan penuding.
Di bawah hud, Go menukar nilai bukan penuding (seperti dalam wg.Tambah(1)) kepada nilai penuding (seperti &wg.Tambah(1)). Ini membenarkan kaedah penyegerakan.WaitGroup dipanggil pada nilai bukan penuding.
Refleksi pada Set Kaedah penyegerakan.WaitGroup
Set kaedah penyegerakan. WaitGroup kosong kerana semua kaedahnya mempunyai penerima penunjuk. Ini disahkan oleh kod pantulan berikut:
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0
Ini bermakna penyegerakan.WaitGroup tidak mempunyai sebarang kaedah yang boleh dipanggil terus pada nilai bukan penunjuk.
Kesimpulan
Ia adalah perkara biasa dalam Pergi untuk mengisytiharkan nilai penyegerakan.WaitGroup tanpa penunjuk (*). Ini mungkin kerana Go membenarkan penggunaan penerima penunjuk pada nilai bukan penuding. Set kaedah penyegerakan.WaitGroup kosong kerana semua kaedahnya mempunyai penerima penuding, yang ditukar secara automatik daripada nilai bukan penuding oleh pengkompil.
Atas ialah kandungan terperinci Mengapa Go boleh menyegerakkan.WaitGroup Berfungsi Tanpa Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!