Go
Build simple, secure, and scalable systems with Go.
— 구글 Go 개발진이 전 세계 인프라 및 시스템 개발팀에게 전파하는 공식 디자인 모토
미치도록 빠른 컴파일 속도와 압도적인 동시성 제어로 Docker와 Kubernetes를 낳은 클라우드 인프라 업계의 위대한 대부. 하지만 에러 핸들링을 위해 코드 라인의 절반 이상을 if err != nil로 도배해야 해서 손가락 관절염을 유발하는 노가다의 지배자(...)
1. 개요
구글에서 고안하고 발표한 오픈소스 정적 타입 정적 컴파일 프로그래밍 언어. C++의 느린 컴파일 속도와 복잡성에 빡친 구글의 고인물 천재 개발자 3인방이 '가장 단순하고, 안전하며, 대규모 분산 서버에 최적화된 언어'를 만들자며 밤샘 연구 끝에 탄생시켰다. 싱글 실행 파일(Single Binary) 하나로 빌드되어 배포가 미치도록 가볍고 쉬우며, 가벼운 경량 스레드인 고루틴(Goroutine)을 무기 삼아 대용량 트래픽 처리의 끝판왕으로 올라섰다.
2. 단순함이 최고의 미덕이다
Go의 가장 큰 철학은 '코드의 단순화와 가독성'이다. 클래스 상속 기능도 없고, 매크로도 없으며, 예외 처리를 위한 try-catch 키워드조차 과감하게 빼버렸다.(...) 언어가 제공하는 예약어 키워드가 단 25개에 불과해, 주니어 개발자라도 며칠 공부하면 시니어 아키텍트가 짠 소스코드를 수월하게 읽고 이해할 수 있다. 이 극단적인 보수주의와 심플함 덕분에 대규모 개발팀에서 여러 명의 개발자가 협업하더라도 마치 한 사람이 짠 것처럼 정갈하고 일관된 코드가 유지된다는 독보적인 소프트웨어 엔지니어링적 장점을 발휘한다.
3. 고루틴(Goroutine)과 채널(Channel)의 동시성 마법
현대 멀티코어 CPU 환경에서 Go가 빛을 발하는 비결은 고루틴(Goroutine)이다. OS가 관리하는 무거운 시스템 스레드가 아니라, Go 런타임 자체 관리하에 가동되는 초경량 논블로킹 스레드 기술이다. 일반적인 스레드는 생성 시 수 메가바이트(MB)의 메모리를 집어삼키지만, 고루틴은 단 몇 킬로바이트(KB) 수준의 초경량 메모리 풋프린트로 시작하여 서버 한 대에서 동시에 수십만 개의 고루틴을 렉 없이 가볍게 띄워 돌릴 수 있다. 또한 스레드 간 안전한 데이터 전달을 위해 메모리를 공유하는 꼼수 대신, 안전한 데이터 파이프라인 통로인 채널(Channel)을 고안하여 스레드 경쟁(Race Condition) 에러를 원천 봉쇄해 냈다.
4. 관련 밈 및 드립
4.1. if err != nil 무한 도배 지옥
Go 언어는 에러 처리를 위한 예외 처리(throw/catch)가 아예 없고, 모든 함수가 에러 값(error)을 명시적으로 리턴하여 개발자가 반드시 검증하도록 강제한다. 이 때문에 Go 소스코드를 열어보면 10줄 단위마다 if err != nil { return err }이라는 지루한 에러 핸들링 코드가 복사 붙여넣기 수준으로 무한 반복된다. 전 세계 백엔드 개발자들은 'Go로 코딩하는 시간의 70%는 이 4줄짜리 err 문장을 손수 타이핑하며 지내며, 내 손목 인대가 나간 주범'이라며 넋두리를 하는 밈이 공유된다.
5. 여담
- Gopher는 주머니쥐다: Go 언어의 귀여운 뚱보 마스코트인 'Gopher'는 두더지가 아니라 미국산 주머니쥐(Pocket Gopher)이다. 롭 파이크의 아내이자 전설적인 일러스트레이터인 르네 프렌치(Renee French)가 디자인했으며, 특유의 멍청하고 귀여운 눈빛 덕분에 수많은 개발 인형과 굿즈로 활발하게 유통되고 있다.
- 사용하지 않는 패키지는 컴파일 에러: Go 컴파일러는 미치도록 철저해서, 소스코드 내에 임포트(Import)해두고 사용하지 않는 외부 라이브러리 패키지나 선언해두고 안 쓰는 변수가 단 하나라도 존재하면 경고를 내뿜는 수준이 아니라 아예 빌드를 멈추는 컴파일 에러를 터트린다. 이 덕분에 코드가 극도로 깨끗하게 강제 청소되지만, 코딩 도중 테스트를 위해 변수를 잠깐 안 쓸 때도 에러를 내며 빌드를 거부당해 주니어들을 당황하게 만드는 주범이기도 하다.
- C언어의 전설이 만들었다: Go의 창시자 중 한 명인 켄 톰슨은 벨 연구소에서 UNIX 운영체제와 C언어의 모태가 된 B언어를 발명한 전산학계의 살아있는 시조새이자 신화적인 인물이다. 그가 만든 언어이기 때문에 문법 구조 곳곳에 고대 C언어의 향기가 정취 깊게 배어 있다.