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


쌍반점(Semicolon)

C처럼 Go의 공식 문법도 쌍반점으로 문장(Statement)을 끝낸다. 하지만 C와는 다르게 이 쌍반점은 소스에 나타나지 않는다. 대신 구문 분석기(Lexer)가 자동으로 문서를 훑으며 간단한 규칙에 따라 쌍반점을 삽입한다. 따라서 문서를 작성할 때 쌍반점을 신경쓰지 않아도 된다.

규칙은 이렇다. 줄을 바꾸기 전 마지막 문장 요소(Token)가 식별자(Identifier, intfloat64 같은 단어 포함)거나, 숫자나 문자열 상수 같은 기본 리터럴이라면, 혹은 아래 문장 요소 중 하나라면 구문 분석기는 항상 해당 문장 요소 뒤에 쌍반점을 삽입한다.

break continue fallthrough return ++ -- ) }

요약하자면, “문장을 끝낼 수 있는 문장 요소로 한 줄이 끝나면 쌍반점을 삽입한다”로 요약할 수 있다.

닫는 괄호 직전에도 쌍반점을 생략할 수 있다. 따라서 아래 문장은 쌍반점을 넣지 않아도 된다.

go func() { for { dst <- <-src } }()

이상적인 Go 프로그램은 for 반복문에서 초기화, 조건, 그리고 반복 요소를 구분할 때나 쌍반점을 사용한다. 또한 한 줄에 여러 문장을 써야 한다면, 문장을 서로 구분하기 위해서도 쌍반점이 필요하다.

쌍반점 삽입 규칙에 의해, 제어문(if, for, switch, select)은 여는 괄호를 다음 줄에 넣을 수 없다. 그렇게 한다면, 괄호 전에 쌍반점이 삽입되어 원치 않는 효과가 발생할 수 있다. 아래처럼 쓰라.

if i < f() {
    g()
}

아래처럼은 쓰지 말라.

if i < f()  // wrong!
{           // wrong!
    g()
}