Rumah >pembangunan bahagian belakang >Golang >Mengapa Go boleh menyegerakkan.WaitGroup Berfungsi Tanpa Penunjuk?

Mengapa Go boleh menyegerakkan.WaitGroup Berfungsi Tanpa Penunjuk?

Barbara Streisand
Barbara Streisandasal
2024-12-06 22:27:15804semak imbas

Why Can Go's sync.WaitGroup Work Without a Pointer?

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!

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