go에서의 흐름 제어문은 if, switch, for, select 이렇게 네가지가 있습니다.

select 문은 병행 처리 코드를 작성할 때 채널을 제어하기 위해 사용됩니다. 그래서
이번 탐방기에서는 생략하고 병행 처리를 소개할 때 같이 소개하겠습니다.

if

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 문도 다른 언어들과 마찬가지로 똑같은 역활을 합니다. 하지만 너무 많은 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, "는 음수입니다")
    }

Switch

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] { ... }

정말 멋진 기능이죠?

for

golang에서는 모든 반복문은 for문으로 사용합니다. 즉, while문이 존재하지 않다는 것이죠.

    for 초기화 구문; 조건식; 후속 작업 {
        ...
    }

golang에서의 for문은 초기화 구문과 후속 작업, 조건식을 생략할 수 있습니다.

    // go에서 for문을 사용하는 법
    for i := 0; i < 10; i++ {
        ...
    }

    for i < 10; {
        ...
    }

    // 무한 루프를 돌 수 있다.
    for {
        ...
    }

break문과 continue문도 존재해서 강제 종료할 때나 반복 작업을 건너뛰고 다음 반복 작업을 수행할 때 유용합니다.

여기까지 간단하게 제어문제 대해 적어봤습니다. 만약 틀린 부분이 있으면 언제든지 지적 부탁드립니다.