Rumah >pembangunan bahagian belakang >Golang >Mengapakah fungsi Tambah, Selesai dan Tunggu WaitGroup dipanggil menggunakan penuding walaupun apabila diisytiharkan sebagai pembolehubah?

Mengapakah fungsi Tambah, Selesai dan Tunggu WaitGroup dipanggil menggunakan penuding walaupun apabila diisytiharkan sebagai pembolehubah?

DDD
DDDasal
2024-11-26 04:13:18387semak imbas

Why are WaitGroup's Add, Done, and Wait functions called using a pointer even when declared as a variable?

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!

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