Maison >développement back-end >Golang >Pourquoi sync.WaitGroup de Go peut-il fonctionner sans pointeur ?

Pourquoi sync.WaitGroup de Go peut-il fonctionner sans pointeur ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 22:27:15792parcourir

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

Pourquoi sync.WaitGroup fonctionne-t-il sans récepteur de pointeur ?

Dans Go, le type sync.WaitGroup est utilisé pour synchroniser les goroutines. Les méthodes de sync.WaitGroup, telles que Add, Done et Wait, sont définies avec des récepteurs de pointeurs. Cependant, il est courant de déclarer les valeurs sync.WaitGroup sans pointeur (*).

Considérez l'extrait suivant :

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()
}

Dans ce code, nous déclarons wg en tant que sync.WaitGroup valeur sans pointeur (*). Ceci est possible car Go permet l'utilisation de récepteurs de pointeurs sur des valeurs non-pointeurs.

Sous le capot, Go convertit une valeur non-pointeur (comme dans wg.Add(1)) en une valeur de pointeur (comme &wg.Add(1)). Cela permet aux méthodes de sync.WaitGroup d'être appelées sur des valeurs non-pointeurs.

Réflexion sur l'ensemble de méthodes de sync.WaitGroup

L'ensemble de méthodes de sync. WaitGroup est vide car toutes ses méthodes ont des récepteurs de pointeurs. Ceci est confirmé par le code de réflexion suivant :

wg := sync.WaitGroup{}
fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0

Cela signifie que sync.WaitGroup n'a aucune méthode pouvant être appelée directement sur des valeurs non-pointeurs.

Conclusion

Il est courant dans Go de déclarer les valeurs sync.WaitGroup sans pointeur (*). Ceci est possible car Go permet l'utilisation de récepteurs de pointeurs sur des valeurs non-pointeurs. L'ensemble de méthodes de sync.WaitGroup est vide car toutes ses méthodes ont des récepteurs de pointeurs, qui sont automatiquement convertis à partir de valeurs non-pointeurs par le compilateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn