for 문에 레이블 사용
for 문에 레이블로 식별자를 붙일 수 있다. for 문 앞에 콜론(:)으로 끝나는 문자가 있으면 레이블로 인식한다. continue, break, 레이블을 함께 사용하면 반복문을 유연하게 제어할 수 있다.
다음은 2차원 배열인 table에서 값이 x인 요소를 찾는 코드이다.
▼ 레이블을 사용하지 않음
x := 7 table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} } found := false for row := 0; row < len(table); row++ { for col := 0; col < len(table[row]); col++ { if table[row][col] == x { found = true fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col) break } } if found { break } }
실행 결과
found 7(row:2, col:2)
table 배열에서 값이 x인 요소를 찾았는지 확인하기 위해 found 변수를 선언했다. 반복문을 수행하여 값이 x인 요소를 찾으면 found에 true를 할당하고 found를 출력한다. 이후 found 값이 true면 전체 루프를 종료한다.
레이블을 이용하면 다음과 같이 간단하게 작성할 수 있다.
▼ break에 레이블 사용
x := 7 table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} } LOOP: for row := 0; row < len(table); row++ { for col := 0; col < len(table[row]); col++ { if table[row][col] == x { fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col) // LOOP로 지정된 for 문을 빠져나옴 break LOOP } } }
실행 결과
found 7(row:2, col:2)
Note
컬렉션 데이터 내부 요소에 차례로 접근할 때는 보통 range 키워드를 사용한다. 다음은 조금 전에 소개한 코드를 range로 다시 작성했다.
x := 7 table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} } LOOP: for row, rowValue := range table { for col, colValue := range rowValue { if colValue == x { fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col) // LOOP로 지정된 for 문을 빠져나옴 break LOOP } } }
range 키워드를 사용하여 컬렉션 데이터를 반복 처리하는 방법은 3장 데이터 타입에서 상세히 다룬다.
다음과 같이 continue에도 레이블을 사용할 수 있다.
▼ continue에 레이블 사용
x := 5 table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} } LOOP: for row := 0; row < len(table); row++ { for col := 0; col < len(table[row]); col++ { if table[row][col] == x { fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col) // LOOP로 지정된 for 문의 다음 반복문 수행 continue LOOP } } }
실행 결과
found 5(row:0, col:1)
found 5(row:1, col:2)
found 5(row:2, col:0)
반복문 여러 개가 중첩될 때 레이블을 사용하면 가독성이 높은 코드를 작성할 수 있다.
Note
레이블은 switch나 select 문에도 사용할 수 있다. 또한, goto 문과 함께 사용할 수도 있다. 하지만 goto 문은 꼭 필요한 경우가 아니면 사용하지 않는 것을 권장한다.
i := 0 HERE: fmt.Print(i) i++ if i == 5 { return } goto HERE