>백엔드 개발 >Golang >익명 함수를 사용하는 Go 동시성 루프가 동일한 값을 인쇄하는 이유는 무엇입니까?

익명 함수를 사용하는 Go 동시성 루프가 동일한 값을 인쇄하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-24 08:41:25327검색

Why Do Go Concurrency Loops with Anonymous Functions Print the Same Value?

For 루프 및 익명 함수를 사용하여 Go 동시성의 예기치 않은 동작 이해

Go에서 for 루프를 사용하여 익명으로 고루틴을 생성하는 경우 함수를 사용하면 예상치 못한 동작이 발생하여 모든 고루틴이 동일한 값을 인쇄하게 될 수 있습니다. 이 동작을 이해하기 위해 다음 코드를 분석해 보겠습니다.

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go func() {
            fmt.Println(i)
            time.Sleep(time.Second * 1)
            wg.Done()
        }()
    }

    wg.Wait()
}

놀랍게도 이 코드는 예상되는 "2, 4, 1, 5," 대신 "6, 6, 6, 6, 6"을 인쇄합니다. 3." 이 예외는 익명 함수에 의해 생성된 클로저로 인해 발생합니다.

Go에서 클로저는 주변 범위에서 변수를 캡처하는 함수입니다. 위 코드에서 각 익명 함수는 변수 i를 캡처합니다. 그러나 for 루프가 반복되면 i는 이미 5입니다. 이는 모든 클로저가 동일한 i 값인 6을 캡처한다는 것을 의미합니다.

이 문제를 해결하려면 i를 인수로 전달할 수 있습니다. 익명 함수. 그렇게 함으로써 우리는 각 클로저에 의해 캡처되는 i의 로컬 복사본을 생성하여 각 고루틴이 올바른 값을 인쇄하도록 보장합니다.

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Println(i)
            time.Sleep(time.Second * 1)
            wg.Done()
        }(i)
    }

    wg.Wait()
}

위 내용은 익명 함수를 사용하는 Go 동시성 루프가 동일한 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.