go에서의 흐름 제어문은 if, switch, for, select 이렇게 네가지가 있습니다.
select 문은 병행 처리 코드를 작성할 때 채널을 제어하기 위해 사용됩니다. 그래서
이번 탐방기에서는 생략하고 병행 처리를 소개할 때 같이 소개하겠습니다.
golang에서의 if문은 다른 언어에서 사용하는 if문과 같은 역활을 한다. 조선식을 판단하여 결과가 true면 if문 내부에 있는 구문을 수행합니다.
if 조건식 {
...
}
golang애서의 조건식에는 소괄호를 사용하지 않습니다. 그래서 종종 실수하시는 경우가 생길 겁니다. 이 부분은 참고해두세요!
그리고 한가지 더 알아야 할것은 조건식의 결과는 반드시 bool 타입이여야 한다. 제가 이 부분을 강조하는 이유는 개발을 하다보면 이런식으로 코드를 작성하는 경우가 있습니다.
// mongoose의 findById를 통해서 post의 내용을 가져올때
const post = await Post.findById(id);
if (!post) {
return res.status(409).json({
name: "포스트가 존재하지 않습니다"
})
}
하지만 go에서는 이런식으로 작성하지면 안됩니다. 무조선 bool타입을 내보내는 형태로 작성해야 합니다.
if post != nil {
...
}
else if 문도 다른 언어들과 마찬가지로 똑같은 역활을 합니다. 하지만 너무 많은 else if문은 가독성을 떨어트릴 수 있기 때문에 최대한 덜 사용하고 만약 많이 사용해야 한다면 switch문을 사용하시면 됩니다.
왜 swtich문을 사용하냐면 바로 밑에서 그 이유를 설명 하겠습니다.
// 한가지 더 말씀을 드리자면 중괄호는 웬만해서는 꼭 사용해주세요!
if 조건식 {
...
} else if 조건식2 {
...
} else {
...
}
// 이런것도 에러가 납니다
if x {
}
else {
}
그리고 go에서의 if문은 또 하나의 멋진 기능이 있습니다. 바로 조건식에서 바로 초기화 구문을 작성할 수 있습니다.
v := compute()
if v < 0 {
fmt.Println(v, "는 음수입니다")
}
// or
if v := compute(); v < 0 {
fmt.Println(v, "는 음수입니다")
}
golang에서의 switch문은 이렇습니다.
switch 값 {
case 조건1 :
...
case 조건2 :
...
default:
...
}
switch문은 첫번쨰 case의 조건부터 차례로 비교하다가 조건이 일치하는 case 구문을 수행하고 switch문을 종료합니다. 그리고 case 식은 값을 하나 이상 쓸수 있습니다.
switch i {
case -1, -2:
...
case 1, 2:
...
}
case조건을 만나면 바로 switch문을 빠져나가기 때문에 switch문에는 break을 쓰지
않아도 됩니다. 만약 일치하는 조건을 만나도 다음 case로 넘어가려면 fallthrough를 표기 사용합니다.
switch i {
case 0:
fallthrough
case 1:
f()
}
아까 위에서 switch문을 else if 문 대신 사용하라고 했는데 그 이유는 여기서 나옵니다.
switch문에서 조건식을 사용하는 것입니다.
func main() {
i := -2
switch {
case i < 0:
fmt.Println(i, "는 음수입니다")
case i == 0:
fmt.Println(i, "는 0입니다")
case i > 0:
fmt.Println(i, "는 양수입니다")
}
}
위에 문법은 else if 구문과 유사하게 동작합니다. else if를 많이 사용하는 것 보다는 switch문을 사용하는게 가독성이 더 좋을 것입니다.
초기화 구문도 작성이 가능합니다.
switch a, b := x[i], y[i] { ... }
정말 멋진 기능이죠?
golang에서는 모든 반복문은 for문으로 사용합니다. 즉, while문이 존재하지 않다는 것이죠.
for 초기화 구문; 조건식; 후속 작업 {
...
}
golang에서의 for문은 초기화 구문과 후속 작업, 조건식을 생략할 수 있습니다.
// go에서 for문을 사용하는 법
for i := 0; i < 10; i++ {
...
}
for i < 10; {
...
}
// 무한 루프를 돌 수 있다.
for {
...
}
break문과 continue문도 존재해서 강제 종료할 때나 반복 작업을 건너뛰고 다음 반복 작업을 수행할 때 유용합니다.
여기까지 간단하게 제어문제 대해 적어봤습니다. 만약 틀린 부분이 있으면 언제든지 지적 부탁드립니다.