> 백엔드 개발 > Golang > Go의 sync.WaitGroup이 포인터 없이 작동할 수 있는 이유는 무엇입니까?

Go의 sync.WaitGroup이 포인터 없이 작동할 수 있는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-06 22:27:15
원래의
783명이 탐색했습니다.

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

왜 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿