이 글은 Effective Go를 일부 번역한 글입니다.


제어 구조

Go의 제어 구조는 C의 그것과 연관이 있지만 중요한 차이가 있다. dowhile 반복이 없고 조금 일반화된 for만 있다. switch는 더 유연하다. ifswitch에도 for처럼 초기화 문장을 넣을 수 있다. breakcontinue 문장엔 이름표를 붙여 벗어나거나 재개할 것을 지정할 수 있다. 또한 새롭게 type switch와 다방향 통신 멀티플렉서 select가 제어 구조에 추가되었다. 구문도 약간 다르다. 괄호가 없으며 본문은 반드시 항상 중괄호로 감싸야 한다.

If

Go에서 if를 간단히 쓰면 이렇다.

if x > 0 {
    return y
}

중괄호를 강제해 간단히 if 문장을 여러 줄에 쓸 수 있다. 이런 방식은 특히 본문에 return이나 break 같은 제어문을 넣을 때 좋다.

if와 switch에 초기화 문장을 넣을 수 있다. 때문에 이 방식은 흔히 지역 변수를 설정하는 데 쓴다.

if err := file.Chmod(0664); err != nil {
    log.Print(err)
    return err
}

Go 라이브러리를 보면, if 문장에서 그 다음 문장으로 넘어가지 않으면 (본문이 break, continue, goto, return으로 끝나는 경우) 필요 없는 else를 생략하는 걸 볼 수 있다.

f, err := os.Open(name)
if err != nil {
    return err
}
codeUsing(f)

이 예제는 오류 조건이 연속적으로 있을 때 이를 처리해야 하는 코드에 대한 예제다. 이 코드는 제어 흐름이 성공적일 때 어떻게 흘러가는지, 오류가 발생하면 오류를 어떻게 처리하는지 읽기 쉽다. 오류 처리는 대개 return 문장으로 끝나기 때문에 결과적으로 이 코드엔 else를 넣지 않아도 된다.

f, err := os.Open(name)
if err != nil {
    return err
}
d, err := f.Stat()
if err != nil {
    f.Close()
    return err
}
codeUsing(f, d)