Go 언어는 C, C++와는 달리 반복문이 for만 있다
C, C++ 등의 for 반복문과 동일하며 단, 반복문을 작성할 때 ( ) (괄호)를 사용하지 않으며 반복문을 시작하는 줄에서 { (여는 중괄호)가 시작됩니다.
초깃값: 반복문이 시작할 때 기준이 되는 값입니다. 바깥에서 변수를 선언하여 사용할 수도 있고, :=를 사용하여 변수를 바로 생성하여 사용할 수도 있다. :=로 변수를 생성했다면 for 반복문 안에서만 접근할 수 있다.
조건식: 조건식의 결과가 참(true)일 때만 중괄호 블록을 반복한다. 따라서 조건식의 결과는 반드시 불형이되어야 하며. C 언어와 달리 조건식의 결과가 정수형, 실수형, 문자열 값 등이 되면 컴파일 에러가 발생
변화식: 중괄호 블록이 한 번 실행된 뒤에 변화할 식을 설정,여기서는 초깃값에 0을 대입한 뒤 조건식을 i < 5로 지정하여 i가 5보다 작을 때까지만 반복하도록 . 그리고 변화식에는 i++을 지정하여 반복할 때마다 i가 1씩 증가하도록 하였으며, 따라서 i가 5가 되면 조건식은 거짓이 되므로 반복문이 끝!!
다음과 같이 여는 중괄호를 다음 줄에 작성하면 컴파일 에러가 발생
for i := 0; i < 5; i++ // 컴파일 에러
{
fmt.Println(i)
}
for i := 5; i > 0; i-- {
fmt.Println(i)
}
i := 0
for i < 5 {
fmt.Println(i)
i = i + 1 // i++
}
for {
fmt.Println("Hello, world!")
}
for 키워드에 아무것도 설정하지 않으면 무한 루프가 발생. 즉, C, C++의 for (;;)처럼 동작, 이때 반복문을 중단하려면 중괄호 블록안에서 조건을 정하고 break 키워드를 사용하면 해결. 물론 변화식도 중괄호 블록 안에서 설정한다
i := 0
for {
if i > 4 { // i가 4가 되는 순간
break // 반복문이 중단됩니다.
}
fmt.Println(i)
i = i + 1 // 변화식에서 조건을 변경합니다.
}
다음과 같이 break 키워드에 레이블을 지정할 수도 있습니다(레이블 이름은 변수 이름을 짓는 규칙과 같다).
Loop: // Loop 레이블을 지정
for i := 0; i < 3; i++ { // 반복문 1
for j := 0; j < 3; j++ { // 반복문 2
if j == 2 { // j가 2일 때
break Loop // 중첩된 반복문을 빠져나옴
}
fmt.Println(i, j)
}
}
fmt.Println("Hello, world!")
결과
0 0
0 1
Hello, world!
다음과 같이 레이블과 for 키워드 사이에 다른 코드가 있으면 에러가 발생한다
Loop:
fmt.Println("begin for loop") // 들어가면 안 되는 코드
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 2 {
break Loop // 컴파일 에러. invalid break label Loop
}
fmt.Println(i, j)
}
}
fmt.Println("Hello, world!")
for i := 0; i < 5; i++ {
if i == 2 { // i가 2일 때
continue // 아래 부분 코드를 실행하지 않고 넘어감
}
fmt.Println(i)
}
Loop:
for i := 0; i < 3; i++ { // 반복문 1
for j := 0; j < 3; j++ { // 반복문 2
if j == 2 { // j가 2일 때
continue Loop // 아래 부분 코드를 실행하지 않고 반복문 1부터 이어서 실행
}
fmt.Println(i, j)
}
}
fmt.Println("Hello, world!")
결과
0 0
0 1
1 0
1 1
2 0
2 1
Hello, world!
Loop:
fmt.Println("begin for loop") // 들어가면 안 되는 코드
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 2 {
continue Loop // 컴파일 에러. invalid continue label Loop
}
fmt.Println(i, j)
}
}
fmt.Println("Hello, world!")
for i, j := 0, 0; i < 10; i, j = i+1, j+2 {
fmt.Println(i, j)
}
i, j = i+1, j+2와 같이 i에는 i+1 값이 대입되고, j에는 j+2 값이 대입되도록 설정하면 됩니다. 마찬가지로 초깃값도 i, j := 0, 0처럼 i, j 변수를 동시에 선언하고 초기화
다음과 같이 변화식 부분에서 병렬 할당을 사용하지 않고 i++, j+2처럼 변화식을 그대로 나열하면 컴파일 에러가 발생하므로 주의해야한다
for i, j := 0, 0; i < 10; i++, j+=2 { // 컴파일 에러. syntax error: unexpected comma, expecting {
fmt.Println(i, j)
}