제공된 코드에서 기본 고루틴은 채널과 대기 그룹. 그런데 가끔 11번을 건너뛰어 불완전한 출력이 나오는 경우가 있습니다.
이 문제는 외부 함수인 Print에 대한 sync.WaitGroup의 잘못된 传递로 인해 발생합니다. WaitGroup의 복사본을 함수에 전달하면 기본 고루틴에서 기다리고 있는 원래 대기 그룹에서 필요한 Done() 호출을 수행할 수 없습니다.
최고의 솔루션:
권장 해결 방법은 다음과 같이 코드를 수정하는 것입니다.
<code class="go">func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
이 수정에서 Print 함수는 대기 그룹에 대한 포인터를 수신하여 해당 Done() 메서드가 기능을 사용하면 기본 고루틴이 올바르게 진행될 수 있습니다.
대체 솔루션:
또는 채널을 직접 닫아 인쇄 기능 내에서 WaitGroup이 필요하지 않게 할 수도 있습니다. 모든 번호를 보낸 후:
<code class="go">func Print(ch <-chan int) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } }</code>
이 경우 기본 고루틴은 채널이 닫힐 때까지 기다려야 합니다.
<code class="go">wg.Wait() close(ch)</code>
위 내용은 외부 함수에서 Sync.WaitGroup 복사본을 사용하면 고루틴에서 출력이 누락되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!