2016-05-31 1 views
0

반복 변수 i을 기반으로 goroutine 내부의 상태를 검사하고 예상치 못한 결과를 얻었으며 몇 가지 간단한 방법으로이를 확인하기로 결정했습니다. 암호.goroutine을 사용하여 반복 할 때 예상치 못한 결과가 발생 함

for i := 1; i <= 5; i++ { 
    wg.Add(1) 
    fmt.Println(i) 

    go func() { 
     fmt.Println(i) 
     wg.Done() 
    }() 


} 
wg.Wait() 

1 
2 
3 
4 
5 
6 
6 
6 
6 
6 

이 예상되는 동작입니까? 누군가가 친절하게 5 시까 지 6을 인쇄하는 이유를 설명 할 수 있습니까?

+1

는 또한 자주 묻는 질문을 참조하십시오 https://golang.org/doc/faq#closures_and_goroutines을 – JimB

+0

어쩌면 더 정확한 중복 : http://stackoverflow.com/questions/36776315/go-concurrency-with-for-loop- and-anonymous-function-behaves-unexpectedly – JimB

+0

6,6,6,6 만받을 필요는 없습니다. i의 값을 늘리십시오. 당신은 다른 가치를 얻을 것이다. 당신은 goroutine의 실행 시점에 i의 가치를 얻고 있습니다. – khrm

답변

5

Playground example

귀하의 모든 goroutines은 루프 귀하가 완료되면 비동기 실행하고 있습니다. 루프 i에 대한의 끝에서

6 같고, 따라서, 귀하의 goroutines 각 당신이 클로저를 만들 수있는 문제를 해결하고, 내부 i의 현재 값을 저장하려면 번호 6.

로그 goroutine이 실행될 때 적절한 값인 i으로 실행되도록합니다.

때의, 그것은

go func(x int) { 
    fmt.Println(x) 
    wg.Done() 
}(i) // <--- "save" value of i at this point in time. 

처럼 당신이 나중에 같은 실행하기 위해 goroutine을 이야기하고있는 함수 내 i의 값을 "저장"이 방법을 보이는 있도록이 그냥 코드를 변경 수행 루프가 완료 될 때까지 실행되었으므로 현재 값이 i 인 6을 사용하지 않습니다. 대신, goroutine을 만들 때의 값이 i입니다.

관련 문제