레이블 붙은 문장(Labeled statements)

레이블 붙은 문장(Labeled statements)

gotobreak, continue처럼 흐름을 꺾는 문장을 쓸 때, 그 문장이 "어디를 가리키는지"를 명확히 하고 싶을 때가 있어요. 그럴 때 쓰는 게 바로 이번에 볼 레이블 붙은 문장(labeled statement) 이에요. 말 그대로 문장에 이름표(label)를 붙여서, 흐름 제어 문장이 그 표를 보고 목적지를 찾아가도록 만드는 구조죠.

출처: Go Specification

본문

레이블 붙은 문장은 goto, break, continue 문장이 가리키는 **대상(target)**이 될 수 있어요. 즉, 이름표를 붙여 두면 다른 문장이 그 이름으로 점프하거나 반복을 벗어날 수 있게 되는 거예요.

구조는 EBNF로 이렇게 정의돼요.

LabeledStmt = Label ":" Statement .
Label       = identifier .

Label은 단순한 식별자(identifier)이고, 문장 위에 Label: 형태로 콜론을 붙여 구분해요.

실제 사용 예시를 볼게요.

Error: log.Panic("error encountered")

여기서는 Error:라는 레이블을 달아 두고, 이 레이블을 목적지로 삼는 goto 문장이 어딘가에서 점프를 해 오는 형태예요. 레이블은 문장 앞에 붙여 해당 위치를 흐름 제어의 기준점으로 만들고, 흐름을 꺾는 문장들이 이 기준점을 보고 이동하는 원리입니다.

더 알아보기

  • goto, break, continue 문장이 각각 어떻게 레이블을 목적지로 삼는지는 각 문장 절에서 더 자세히 다뤄요.
  • 레이블 이름은 함수 내부에서 충돌하지 않도록 고유하게 붙여야 해요. 문장이 중첩될수록 어느 레이블을 가리키는지 헷갈리기 쉬우니, 이름을 지을 때 목적지가 분명히 드러나게 하는 게 좋아요.