왜 sync.WaitGroup이 포인터 수신기 없이 작동하나요?
Go에서는 sync.WaitGroup 유형이 고루틴을 동기화하는 데 사용됩니다. Add, Done 및 Wait와 같은 sync.WaitGroup의 메소드는 포인터 수신기로 정의됩니다. 그러나 포인터(*) 없이 sync.WaitGroup 값을 선언하는 것이 일반적입니다.
다음 스니펫을 고려하세요.
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() }
이 코드에서는 wg를 sync.WaitGroup으로 선언합니다. 포인터(*)가 없는 값입니다. 이는 Go가 포인터가 아닌 값에 포인터 수신기를 사용할 수 있도록 허용하기 때문에 가능합니다.
내부적으로 Go는 포인터가 아닌 값(예: wg.Add(1))을 포인터 값으로 변환합니다. (예: &wg.Add(1)). 이를 통해 포인터가 아닌 값에서 sync.WaitGroup의 메소드를 호출할 수 있습니다.
sync.WaitGroup의 메소드 세트에 대한 반영
sync의 메소드 세트. WaitGroup은 모든 메서드에 포인터 수신기가 있으므로 비어 있습니다. 이는 다음 리플렉션 코드로 확인됩니다.
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0
이는 sync.WaitGroup에 포인터가 아닌 값에 대해 직접 호출할 수 있는 메서드가 없음을 의미합니다.
결론
Go에서는 포인터(*) 없이 sync.WaitGroup 값을 선언하는 것이 일반적입니다. 이는 Go가 포인터가 아닌 값에 포인터 수신기를 사용할 수 있도록 허용하기 때문에 가능합니다. sync.WaitGroup의 메소드 세트는 모든 메소드에 컴파일러에 의해 포인터가 아닌 값에서 자동으로 변환되는 포인터 수신기가 있기 때문에 비어 있습니다.
위 내용은 Go의 sync.WaitGroup이 포인터 없이 작동할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!