Go 반복문

1. for 문

Go 프로그래밍 언어에서 반복문은 for 루프를 이용한다. Go는 반복문에 for 하나 밖에 없다. for 루프는 다른 언어와 비슷하게 "for 초기값; 조건식; 증감 { ... }" 의 형식을 따른다. 물론 초기값, 조건식, 증감식 등은 경우에 따라 생략할 수 있다. 다만, "초기값; 조건식; 증감"을 둘러싸는 괄호 ( )를 생략하는데, 괄호를 쓰면 에러가 난다. 아래 예제는 1부터 100까지 더하는 for 루프문 예이다.

package main

func main() {
	sum := 0
	for i := 1; i <= 100; i++ {
		sum += i
	}
	println(sum)
}

2. for 문 - 조건식만 쓰는 for 루프

Go에서 for 루프는 초기값과 증감식을 생략하고 조건식만을 사용할 수 있는데, 이는 마치 for 루프가 다른 언어의 while 루프와 같이 쓰이도록 한다. 아래 예제에서 for 루프는 n이 100을 넘는지를 체크하는 조건식만을 사용하고 있다.

package main

func main() {
    n := 1
	for n < 100 {
		n *= 2		
		//if n > 90 {
		//   break 
		//}		
	}
	println(n)
}

3. for 문 - 무한루프

for 루프로 무한루프를 만들려면 "초기값; 조건식; 증감" 모두를 생략하면 된다. 아래 예제는 무한루프를 만든 예이다. 무한루프를 빠져나오기 위해 Ctrl+C 를 누른다.

package main

func main() {
	for {
		println("Infinite loop")		
	}
}

4. for range 문

for range 문은 컬렉션으로 부터 한 요소(element)씩 가져와 차례로 for 블럭의 문장들을 실행한다. 이는 다른 언어의 foreach와 비슷한 용법이다.

for range 문은 "for 인덱스,요소값 := range 컬렉션" 같이 for 루프를 구성하는데, range 키워드 다음의 컬렉션으로부터 하나씩 요소를 리턴해서 그 요소의 위치인덱스와 값을 for 키워드 다음의 2개의 변수에 각각 할당한다.

아래 예제는 3명의 이름을 갖는 문자열 배열에서 문자열 인덱스(0, 1, 2)와 해당 이름을 차례로 가져와 프린트하는 코드이다.
(주: Go 컬렉션 타입을 아직 소개하지 않았지만 for 루프와 관련되어 있어 여기에 소개한다)

	names := []string{"홍길동", "이순신", "강감찬"}

	for index, name := range names {
		println(index, name)
	}

5. break, continue, goto 문

경우에 따라 for 루프내에서 즉시 빠져나올 필요가 있는데, 이때 break 문을 사용한다. 만약 for 루프의 중간에서 나머지 문장들을 실행하지 않고 for 루프 시작부분으로 바로 가려면 continue문을 사용한다. 그리고 기타 임의의 문장으로 이동하기 위해 goto 문을 사용할 수 있다. goto문은 for 루프와 관련없이 사용될 수 있다.

break문은 for 루프 이외에 switch문이나 select문에서도 사용할 수 있다. 하지만, continue문은 for 루프와 연관되어 사용된다.

package main
func main() {
	var a = 1
	for a < 15 {
		if a == 5 {
			a += a
			continue // for루프 시작으로
		}
		a++
		if a > 10 {
			break  //루프 빠져나옴
		}
	}
	if a == 11 {
		goto END //goto 사용예
	}
	println(a)

END:
	println("End")
}

break문은 보통 단독으로 사용되지만, 경우에 따라 "break 레이블"과 같이 사용하여 지정된 레이블로 이동할 수도 있다. break의 "레이블"은 보통 현재의 for 루프를 바로 위에 적게 되는데, 이러한 "break 레이블"은 현재의 루프를 빠져나와 지정된 레이블로 이동하고, break문의 직속 for 루프 전체의 다음 문장을 실행하게 한다. 아래 예제는 언뜻 보기에 무한루프를 돌 것 같지만, 실제로는 OK를 출력하고 프로그램을 정상 종료한다. 이는 "break L1" 문이 for 루프를 빠져나와 L1 레이블로 이동한 후, break가 있는 현재 for 루프를 건너뛰고 다음 문장인 println() 으로 이동하기 때문이다.

package main

func main() {
	i := 0

L1:
	for {
	
		if i == 0 {
			break L1
		}
	}

	println("OK")
}