Go statements

Go statements (go 문)

어떤 함수 호출을 마치 "지금 시작해, 넌 알아서 해"라고 던져두는 문법이 있어요. 그래서 프로그램 실행 흐름을 기다리게 하지 않고, 함수를 독립된 동시 실행 흐름으로 출발시키는 게 바로 go 문 예요. 여기서 그 독립된 흐름을 가리키는 이름이 바로 우리가 자주 듣는 goroutine 이죠.

출처: Go Specification

본문

go 문은 함수 호출(function call)의 실행을, 같은 주소 공간(address space) 안에서 독립적인 동시 실행 흐름(independent concurrent thread of control), 곧 goroutine 으로 시작해요. 문법은 아주 짧은데, 키워드 go 하나 뒤에 표현식 하나가 오는 게 전부예요.

GoStmt = "go" Expression .

이 표현식은 함수 호출이나 메서드 호출이어야 하고, 괄호로 감싸면 안 돼요. 내장 함수(built-in function)의 호출은 표현식 문(expression statements)에서 허용하는 범위와 똑같이 제한돼요.

함수 값과 인자(parameter)는 일반적인 호출에서처럼 호출하는 쪽 goroutine 안에서 평소대로 평가돼요. 여기까지는 평범한 함수 호출과 같아요. 그런데 차이는 여기서 시작돼요 — 일반 호출과 달리 프로그램 실행이 그 함수가 끝나기를 기다리지 않아요. 대신 그 함수는 새로운 goroutine에서 독립적으로 실행되기 시작하죠. 함수가 종료되면 그 goroutine도 함께 종료되고요. 만약 함수가 반환값을 가진다면, 그 값들은 함수가 완료될 때 그냥 버려져요.

실제 코드로 보면 조금 더 직관적으로 와 닿을 거예요.

go Server()
go func(ch chan<- bool) { for { sleep(10); ch <- true }} (c)

첫 번째 줄처럼 go Server()라고 쓰면 Server()가 새 goroutine에서 따로 돌아가는 거고, 두 번째 줄처럼 익명 함수(anonymous function)를 go로 호출해서 백그라운드 작업을 던져두는 패턴도 자주 써요. 어느 쪽이든 핵심은 같아요 — 기다리지 않고 독립 실행 흐름을 하나 더 띄운다, 이 한 가지예요.

더 알아보기

  • goroutine에 대한 문법 정의 주의점: 표현식은 함수·메서드 호출이어야 하며 괄호로 감쌀 수 없어요.
  • 일반 호출과의 차이 — 값 평가는 호출 쪽 goroutine에서 평소대로, 실행은 기다림 없이 새 goroutine에서.
  • 함수가 끝나면 그 goroutine도 끝나고, 반환값은 있어도 버려진다는 점을 기억해 두세요.
  • 관련 개념: 표현식 문(expression statements), 호출(Calls)