[Go] 개요
Updated:
Go?
- 구글의 엔지니어 로버트 그리즈머, 롭 파이크, 켄 톰프슨이 개발한 프로그래밍 언어
- 2009년 11월 10일 발표
- 단순함, 효율성, 안정성에 중점을 둔 오픈소스 프로그래밍 언어
- 정적 타입, 컴파일 언어이면서도 동적 언어의 생산성 제공
- 최신 안정 버전: Go 1.23 (2024년 8월)
주요 특징
- 간결한 문법: 키워드 25개로 빠른 학습 곡선
- 강력한 동시성: 경량 스레드인 고루틴과 채널을 통한 CSP(Communicating Sequential Processes) 모델
- 빠른 빌드: 의존성 관리 최적화로 대규모 프로젝트도 수초 내 빌드
- 메모리 안전성: 자동 메모리 관리 및 경계 검사
- 표준화된 코드: gofmt를 통한 코드 포맷 표준화
장점
성능 및 효율성
- 빠른 컴파일 속도: C 수준의 성능, 초단위 빌드 시간
- 효율적인 메모리 사용: 저지연 가비지 컬렉션 (sub-millisecond pause)
- 경량 고루틴: 수천~수백만 개의 동시 실행 고루틴 지원 (스택 크기 ~2KB)
배포 및 운영
- 크로스 플랫폼 지원: 단일 정적 바이너리로 배포 (의존성 없음)
- 다양한 아키텍처: Linux, Windows, macOS, ARM, WASM 등 지원
- 컨테이너 최적화: 작은 바이너리 크기로 Docker 이미지 최소화
개발 생산성
- 풍부한 표준 라이브러리: HTTP 서버/클라이언트, JSON, 암호화, 테스팅 등 내장
- 우수한 도구 생태계: gofmt, go vet, golangci-lint, gopls (LSP) 등
- 간결한 동시성 모델: 고루틴과 채널을 통한 직관적인 병렬 처리
- 다중값 반환: 에러 처리를 명시적으로 처리 가능
- 의존성 관리: go modules를 통한 버전 관리 및 재현 가능한 빌드
코드 품질
- 정적 타입 검사: 컴파일 시점에 대부분의 오류 발견
- 엄격한 컴파일러: 사용하지 않는 변수/패키지는 컴파일 에러
- 런타임 안전성: 데드락 감지, 패닉 복구 메커니즘
- 표준화된 포맷: gofmt로 일관된 코드 스타일 유지
단점 및 제약사항
언어 설계 철학에 따른 제약
- 상속 미지원: 컴포지션과 인터페이스로 대체 (의도적 설계)
- 함수 오버로딩 미지원: 명시적 함수명 사용 권장
- 디폴트 매개변수 미지원: 가독성을 위한 명시적 인자 전달
- 예외(Exception) 미지원: error 타입을 통한 명시적 에러 처리
기능적 제약
- 제한적인 Generics: Go 1.18부터 지원되나 일부 고급 패턴 제약
- enum 타입 미지원: iota를 사용한 상수로 대체
- 고루틴 반환값: 직접 반환 불가, 채널/sync 패키지 활용 필요
- 에러 처리 중복:
if err != nil패턴의 반복적 사용
생태계
- 특정 분야의 생태계 부족: 데이터 과학, 머신러닝, 게임 개발 등에서는 Python/JavaScript 대비 성숙한 라이브러리가 부족
- GUI 개발 제한적: 백엔드/CLI/인프라 도구에 최적화되어 있으며, 데스크톱 GUI 프레임워크는 상대적으로 덜 성숙함
참고: go-is-not-good - Go의 다양한 제약사항 논의
주요 활용 분야
- 클라우드 네이티브: Kubernetes, Docker, Prometheus 등 CNCF 프로젝트
- 마이크로서비스: gRPC, RESTful API 서버 개발
- DevOps 도구: Terraform, Vault, Consul 등 인프라 자동화
- CLI 도구: cobra, viper를 활용한 명령줄 애플리케이션
- 네트워크 프로그래밍: 고성능 프록시, 로드밸런서
- 데이터 처리: 실시간 스트리밍, ETL 파이프라인
- 블록체인: Ethereum Geth, Hyperledger Fabric