관심있는 것들 정리

Golang 연습 2 (goroutine w/ loop) 본문

programming/Golang

Golang 연습 2 (goroutine w/ loop)

내공강화 2021. 1. 25. 10:15
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 동작 관련 

stonzeteam.github.io/How-Goroutines-Work/

반응형