Go
Go
개요
Go(또는 Golang)는 구글에서 2007년부터 개발을 시작해 2009년에 공개한 정적 타입(Statically Typed)·컴파일형(Compiled)·병행성(Concurrency) 지원 프로그래밍 언어이다. 간결한 문법, 빠른 컴파일 속도, 효율적인 메모리 관리, 그리고 [goroutine](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/goroutine)·[channel](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/channel)을 통한 경량 스레드 모델을 핵심으로 하여 서버·클라우드·네트워크·시스템 프로그래밍 분야에서 널리 사용된다.
정적 타입 : 변수의 타입이 컴파일 시점에 결정되는 방식으로, 런타임 오류를 사전에 방지한다.
컴파일형 : 소스 코드를 기계어 바이너리로 변환하여 실행한다. 실행 속도가 빠르고 배포가 용이하다.
병행성 : 여러 작업을 동시에 진행할 수 있는 프로그래밍 기법을 말한다.
역사
| 연도 | 주요 사건 |
|---|---|
| 2007 | 로버트 그리머(Rob Pike), 로브 파이크(Ken Thompson) 등 구글 엔지니어들이 Go 설계 시작 |
| 2009 | Go 1.0 정식 공개(오픈소스) |
| 2012 | Go 1.2 발표 – 런타임 개선 및 패키지 관리 도구 go get 강화 |
| 2015 | Go 1.5 발표 – 컴파일러가 C 컴파일러 없이 순수 Go 구현, GC(가비지 컬렉터) 성능 향상 |
| 2019 | Go 1.13 발표 – 모듈 시스템([go.mod](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC/go.mod)) 도입, 의존성 관리 표준화 |
| 2022 | Go 1.19 발표 – generics(제네릭) 정식 지원, 코드 재사용성 대폭 확대 |
| 2024 | Go 1.22 발표 – [sync](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/sync)/atomic 개선, [io](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/io)/fs 확장 등 |
주요 특징
1. 간결하고 명확한 문법
- 중괄호(
{})와 세미콜론(;)을 최소화한다. - 선언문은
var,const,type,func등 키워드로 시작한다.
2. 강력한 병행성 모델
- goroutine: OS 스레드보다 가볍고 수천 개까지 동시에 실행 가능.
- channel: goroutine 간 안전하게 데이터를 교환하는 통신 수단.
select구문을 통해 다중 채널을 동시에 감시한다.
3. 정적 타입과 타입 추론
- 변수 선언 시 타입을 명시하지 않아도 컴파일러가 자동 추론한다(
:=연산자). - 하지만 명시적 타입 선언도 가능해 코드 가독성을 높인다.
4. 빌트인 툴체인
[go build](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B9%8C%EB%93%9C%20%EB%8F%84%EA%B5%AC/go%20build),[go test](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%ED%85%8C%EC%8A%A4%ED%8A%B8/go%20test),[go fmt](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%ED%8F%AC%EB%A7%B7%ED%84%B0/go%20fmt),[go vet](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%A0%95%EC%A0%81%20%EB%B6%84%EC%84%9D/go%20vet),[go run](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%8B%A4%ED%96%89%20%EB%8F%84%EA%B5%AC/go%20run)등 표준 도구가 하나의 바이너리로 제공된다.go fmt는 코드 포맷을 자동으로 맞춰 팀 협업 시 스타일 충돌을 방지한다.
5. 풍부한 표준 라이브러리
- 네트워킹(
[net/http](/doc/%EA%B8%B0%EC%88%A0/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/HTTP/net%2Fhttp)), 동시성(sync), 암호화([crypto](/doc/search%3Fq%3Dcrypto///crypto)), 파일 입출력(io/ioutil) 등 광범위한 기능을 기본 제공한다.
문법 및 기본 구조
Hello, World! 예제
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
[package](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/package) main : 실행 파일을 만들 때 반드시 main 패키지를 사용한다.-
import "fmt" : 표준 출력 함수가 정의된 fmt 패키지를 가져온다.-
func main() : 프로그램 진입점(entry point) 함수이다.
변수와 상수
var (
count int // 명시적 타입 선언
name = "Go" // 타입 추론
)
const Pi = 3.14159
구조체와 메서드
type Point struct {
X, Y float64
}
// 메서드 정의 (포인터 리시버)
func (p *Point) Distance() float64 {
return math.Sqrt(p.X*p.X + p.Y*p.Y)
}
[struct](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B5%AC%EC%A1%B0/struct/struct) : 필드들의 집합으로, 객체 지향에서 클래스와 유사한 역할을 한다.- 메서드 리시버(
(p *Point))는 해당 구조체에 메서드를 연결한다.
인터페이스
type Reader interface {
Read(p []byte) (n int, err error)
}
동시성 모델
Goroutine 생성
go func() {
fmt.Println("백그라운드 작업")
}()
go 키워드 하나만으로 새로운 goroutine을 시작한다.
Channel 사용
ch := make(chan int, 5) // 버퍼가 5인 채널 생성
ch <- 10 // 값 전송
v := <-ch // 값 수신
- 언버퍼드 채널(unbuffered)는 송신과 수신이 동시에 이루어져야 한다.
Select 구문
select {
case msg := <-ch1:
fmt.Println("ch1:", msg)
case ch2 <- 42:
fmt.Println("sent to ch2")
default:
fmt.Println("no communication")
}
표준 라이브러리와 도구
| 카테고리 | 주요 패키지 | 역할 |
|---|---|---|
| 입출력 | io, [os](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/os), [bufio](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/bufio) |
파일·스트림 처리 |
| 네트워킹 | net, net/http, [grpc](/doc/%EA%B8%B0%EC%88%A0/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/gRPC/grpc) |
TCP/UDP·HTTP·gRPC 구현 |
| 동시성 | sync, [sync/atomic](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/sync%2Fatomic), [context](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Go/context) |
뮤텍스·원자 연산·취소 전파 |
| 암호화 | crypto, hash |
해시·TLS·RSA 등 |
| 테스트 | [testing](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%ED%85%8C%EC%8A%A4%ED%8A%B8/testing), [testify](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%ED%85%8C%EC%8A%A4%ED%8A%B8/testify) |
유닛·통합 테스트 지원 |
| 모듈 관리 | go.mod, [go.sum](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC/go.sum) |
의존성 버전 고정 및 관리 |
go.mod 예시
module github.com/example/project
go 1.22
require (
github.com/gin-gonic/gin v1.9.0
golang.org/x/net v0.12.0
)
module 선언은 프로젝트 루트 디렉터리를 모듈로 정의한다.-
require 구문은 외부 패키지와 버전을 명시한다.
개발 환경
| 도구 | 설명 |
|---|---|
| VS Code + Go extension | 실시간 오류 진단·코드 자동완성·디버깅 지원 |
| GoLand | JetBrains에서 제공하는 상용 IDE, 강력한 리팩터링·프로파일링 기능 |
| Delve | Go 전용 디버거, dlv 명령어로 브레이크포인트·스택 트레이스 확인 |
| Docker | golang 이미지로 빌드·테스트 환경을 일관되게 구성 |
| CI/CD | GitHub Actions·GitLab CI에서 go test, go vet, golangci-lint 등 자동화 가능 |
주요 프로젝트와 사용 사례
- Docker : 컨테이너 엔진 자체가 Go로 구현되어 높은 이식성과 성능을 제공한다.
- Kubernetes : 클러스터 관리·스케줄링 핵심 컴포넌트가 Go 기반이다.
- Terraform : 인프라를 코드로 관리하는 도구이며, 플러그인 시스템이 Go로 작성된다.
- Prometheus : 모니터링 시스템·시계열 데이터베이스, 고성능 수집 에이전트가 Go로 구현.
- Etcd : 분산 키-값 저장소, Raft 합의 알고리즘 구현에 Go를 사용한다.
비교·평가
| 언어 | 컴파일 속도 | 실행 성능 | 병행성 모델 | 학습 난이도 | 주요 사용 분야 |
|---|---|---|---|---|---|
| Go | 매우 빠름(수초) | 빠름(네이티브) | goroutine·channel |
낮음(간결) | 서버·클라우드·네트워킹 |
| C++ | 느림(수분) | 매우 빠름 | std::thread·asio |
높음(복잡) | 시스템·게임·고성능 |
| Java | 중간 | 중간 | Executor·CompletableFuture |
중간 | 엔터프라이즈·모바일 |
| Rust | 중간 | 빠름 | async/await·tokio |
높음(소유권) | 시스템·보안·임베디드 |
- 장점: 빠른 컴파일·배포, 간단한 병행성, 풍부한 표준 라이브러리.
- 단점: 제네릭 도입 이전에는 코드 재사용성이 제한적이었으며, 런타임에 동적 로딩이 불가능해 플러그인 구조가 복잡할 수 있다(하지만 Go 1.22부터
plugin패키지가 개선됨).
참고 자료
- 공식 문서 – https://golang.org/doc/
- Effective Go – Go 언어의 베스트 프랙티스 가이드
- The Go Programming Language (Alan A. A. Donovan, Brian W. Kernighan) – 권위 있는 교재
- Go Blog – 최신 릴리즈와 설계 의도에 대한 블로그 포스트
- GitHub – golang/go – 언어 구현 및 이슈 트래커
본 문서는 2026년 현재 최신 정보를 반영하였으며, 지속적인 업데이트가 필요합니다.
이 문서는 AI 모델(gpt-oss-120b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.