관심있는 것들 정리
Golang 연습 2 (goroutine w/ loop) 본문
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(i)
}()
}
wg.Wait()
}
위 코드 수행 시 기대는 1, 2, 3이 출력되기를 기대했지만... 결과는 다음과 같이 이상하게 출력됨
4 4 4 |
go routine이 동작하는 방식을 제대로 이해하지 못해 문제가 생긴 것인데....
다음과 같이 parameter로 값을 넣어주면 총 합이 아닌 하나씩 출력은 된다
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
}
wg.Wait()
}
실행 결과는 다음과 같이 3,2,1 또는 1,2,3 또는 1,3,2 와 같이... concurrent하게 실행된 결과가 나오게 된다.
3 2 1 |
이는 goroutine이 loop가 완전히 끝난 후 생성되기 때문으로, parameter로 인자를 넘겨야 한다
go routine 동작 관련
반응형
'programming > Golang' 카테고리의 다른 글
Golang 연습 6 (channel close check) (0) | 2021.01.26 |
---|---|
Golang 연습 5 (duck typing using interface) (0) | 2021.01.26 |
Golang 연습 4 (slice traversal) (0) | 2021.01.25 |
Golang 연습 3 (99 bottles of beer) (0) | 2021.01.25 |
golang 연습 1 (waitgroup) (0) | 2021.01.25 |