sync.WaitGroup의 메소드 세트
sync.WaitGroup은 고루틴 모음이 완료될 때까지 기다릴 수 있는 동기화 프리미티브입니다. . 설명서에는 Add, Done 및 Wait 메서드에 포인터 수신기가 필요하다고 나와 있지만 포인터가 아닌 값에도 사용할 수 있습니다. 이것이 어떻게 가능합니까?
비결은 sync.WaitGroup의 빈 메소드 세트에 있습니다. 이는 sync.WaitGroup의 모든 메소드가 포인터 수신자임을 의미합니다. 다음과 같은 sync.WaitGroup 유형의 값을 생성할 때:
var wg sync.WaitGroup
실제로는 sync.WaitGroup 구조체에 대한 포인터를 생성하는 것입니다. 이 포인터는 wg 변수에 대한 메서드를 호출할 때 자동으로 역참조됩니다. 예를 들어, 다음 코드는 성공적으로 컴파일됩니다.
wg.Add(1) wg.Done() wg.Wait()
Go 컴파일러는 메소드를 호출하기 전에 암시적으로 wg를 sync.WaitGroup에 대한 포인터로 변환합니다. 이 동작은 Go 언어 사양에 정의되어 있습니다.
x가 주소 지정 가능하고 &x의 메서드 세트에 m이 포함된 경우 x.m()은 (&x).m()의 약어입니다.
따라서 포인터가 아닌 값에 주소를 지정할 수 있는 경우 포인터 수신기가 있는 메서드를 호출할 수 있습니다. 포인터가 아닌 값은 Go에서 항상 주소 지정이 가능합니다.
위 내용은 포인터가 아닌 값에서 sync.WaitGroup 메서드를 호출할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!