Go 언어 제어문과 반복문 정리: if, switch, for 제대로 이해하기
변수와 타입을 어느 정도 익히고 나면, 다음으로 자연스럽게 넘어가는 주제가 제어문과 반복문이다.
Go는 “문법이 단순하다”는 평가를 많이 받지만, 이 부분에서 특히 그 특징이 잘 드러난다.
다른 언어를 경험해본 사람이라면 익숙한 개념들이지만,
Go에서는 의도적으로 제거된 문법과 명확하게 제한된 규칙들이 있다.
처음엔 불편하게 느껴질 수 있지만, 실제로 써보면 코드 흐름이 정리된다는 느낌을 받게 된다.
이 글은 Go의 if, switch, for 문을 중심으로
왜 이렇게 설계됐는지, 실제로 쓰면서 느끼는 포인트를 함께 정리한다.
if 문: 조건식은 단순하게
Go의 if 문은 다른 언어와 큰 차이는 없지만, 몇 가지 중요한 제한이 있다.
if x > 10 {
fmt.Println("x is greater than 10")
}
- 조건식에는 반드시 bool 타입만 사용 가능
- 괄호 ()를 사용하지 않는다
- 중괄호 {}는 필수
이 규칙 덕분에 조건식이 애매해질 여지가 없다.
실제로 써보면, 조건이 명확하지 않은 코드는 컴파일 단계에서 바로 걸러진다.
if 초기문 (if with short statement)
Go에서는 if 문 안에서 변수를 선언하면서 조건을 검사할 수 있다.
if n := len(s); n > 0 {
fmt.Println("string length:", n)
}
- n은 if 블록 내부에서만 유효
- 불필요한 변수 스코프 확장을 막아준다
이 패턴은 에러 처리나 값 검증에서 자주 쓰인다.
처음엔 낯설지만, 익숙해지면 코드가 훨씬 정돈된다.
switch 문: break가 필요 없는 구조
Go의 switch는 다른 언어와 비교했을 때 상당히 깔끔하다.
switch day {
case "mon":
fmt.Println("Monday")
case "tue":
fmt.Println("Tuesday")
default:
fmt.Println("Unknown day")
}
- 각 case 끝에 break를 쓰지 않아도 된다
- 하나의 case만 실행되고 자동으로 종료된다
의도치 않은 fallthrough 버그를 원천적으로 막는 구조다.


조건 없는 switch
Go에서는 조건식을 생략한 switch도 자주 사용된다.
switch {
case x > 10:
fmt.Println("large")
case x > 0:
fmt.Println("positive")
default:
fmt.Println("zero or negative")
}
이 방식은 여러 if-else를 나열하는 것보다 읽기 쉬운 경우가 많다.
실무에서도 범위 조건 분기에서 자주 등장한다.
fallthrough는 명시적으로만
switch n {
case 1:
fmt.Println("one")
fallthrough
case 2:
fmt.Println("two")
}
- fallthrough를 써야 다음 case로 넘어간다
- 의도가 명확하지 않으면 잘 사용하지 않는다
개인적으로는, 정말 필요한 경우가 아니면 거의 쓰지 않게 된다.
for 문: Go에는 반복문이 하나뿐이다
Go에는 while, do-while이 없다.
반복문은 오직 for 하나다.
for i := 0; i < 5; i++ {
fmt.Println(i)
}
가장 기본적인 형태는 C 스타일과 유사하다.
while처럼 사용하는 for
for x < 10 {
x++
}
조건만 남기면 while과 같은 역할을 한다.
무한 루프
for {
fmt.Println("loop")
}
- 서버, 워커, 이벤트 루프에서 자주 사용
- 종료 조건은 내부에서 명시적으로 처리
range 기반 반복
nums := []int{1, 2, 3}
for i, v := range nums {
fmt.Println(i, v)
}
- slice, array, map, string 등에서 사용 가능
- 인덱스와 값을 동시에 받을 수 있다
실제로 써보면, 컬렉션을 순회할 때 가장 많이 사용하는 패턴이다.


정리
Go의 제어문과 반복문은
선택지를 줄이고, 흐름을 단순하게 만드는 방향으로 설계되어 있다.
- 조건식은 항상 명확한 bool
- switch는 안전한 분기 구조
- for 하나로 모든 반복을 표현
처음엔 “왜 이 기능이 없지?”라는 생각이 들 수 있다.
하지만 일정 규모 이상의 코드를 작성하다 보면,
이 제약들이 코드 가독성과 유지보수성에 도움을 준다는 걸 체감하게 된다.
이런 경우에 잘 맞는다
- 로직 흐름이 명확한 코드를 선호하는 경우
- 팀 단위 개발에서 일관된 스타일을 유지하고 싶은 경우
반대로, 문법적인 자유도가 높은 언어에 익숙하다면 초반엔 답답할 수 있다.
다음 글에서는 구조체와 메서드, 그리고 Go다운 코드 구조로 이어가는 게 좋다.