Go 입문 가이드

본 문서에서는 Go 언어 입문 방법을 안내합니다. 문법 측면만 보면 어렵지 않으며, 며칠이면 익힐 수 있습니다. 하지만 관례적으로 본격적인 시작에 앞서 배경과 기원에 대해 먼저 알아보겠습니다.
배경
Go 언어는 세 명의 대가에 의해 창조되었습니다.
- Ken Thompson: 튜링상 수상자, Unix 시스템 창시자, B 언어 창시자, C 언어 창시자
- Rob Pike: Plan9 운영체제 저자 중 한 명, UTF-8 발명자 중 한 명, Go 언어 설계 주도자
- Robert Griesemer: JS V8 엔진 연구 개발자, 세 명 중 가장 젊음
또 한 분은 Rob Pike 의 부인 Renee French 로, Go 언어 로고인 파란색 들쥐를 디자인했습니다.

어느 날, 세 엔지니어는 긴 C++ 프로젝트 컴파일을 기다리는 동안 지루함을 느꼈고, 바로 이 순간 Rob Pike 의 머릿속에 참신한 구상이 떠올랐습니다. 그는 간결하고 작으며 컴파일이 빠르고 동시에 뛰어난 성능을 가진 프로그래밍 언어를 설계하고 싶었고, 이렇게 하면 매번 컴파일 시 긴 기다림을 겪지 않아도 될 것이라고 생각했습니다. 짧은 브레인스토밍 끝에 세 사람은 2007 년 9 월 20 일에 간단한 회의를 소집하여 이 언어의 초기 프로토타입을 논의하고 설계하기 시작했고, 바로 이 순간부터 Go 언어가 탄생했습니다. 이후 이 작은 팀은 점점 더 많은 동조 개발자들을 끌어들였고, 결국 2009 년 11 월 10 일에 구글은 Go 언어를 BSD-3-Clause 라이선스로 공식 오픈소스화했으며 첫 번째 선행 버전을 출시하고 공식 개발 팀을 구성했습니다.
안내
值得一提的是,你可能会在其它地方看见有人叫它 Golang,包括本站的 Github 仓库名也叫 Golang-Doc,但它的官方名字其实是一直是 Go,早期的时候由于 go 这个域名被抢注了,所以官网的域名就采用了 golang.org,以至于后面新来的人误以为它就叫 Golang.

그 후 Go 팀은 3 년간의 설계와 개발을 거쳐 2012 년 3 월에 첫 번째 공식 버전인 Go1.0 을 출시했습니다 (이때 Go 의 툴체인과 런타임은 여전히 C 언어로 작성되었으며, Go1.5 에 이르러서야 자체 부트스트래핑을 완료했습니다). 이후 매년 두 개의 마이너 버전을 업데이트하며 현재까지 운영 및 유지보수하고 있습니다.
세 창시자는 실제로 매우 일찍 퇴진했으며, 대부분의 시간 동안 팀 리더는 Russ Cox 였습니다. 그는 Go 언어가 외부에 공개되기 전에도 개발 작업에 참여했으며, 이후 12 년 동안 Go 팀을 관리하다가 2024 년 8 월에 퇴임하고 Austin Clements 가 인수하여 이후 개발 작업을 이끌고 있습니다.
Go 언어의 역사에 대해 더 깊이 알고 싶다면 Go History 에서 더 많은 내용을 확인하세요.
특징
- 문법 단순 Go 언어는 자유도와 유연성 사이에서 절충을 하여 더 나은 유지보수성과 완만한 학습 곡선을 얻었습니다.
- 배포 친화적 Go 의 정적 컴파일된 바이너리 파일은 추가 런타임 환경에 의존하지 않으며, 컴파일 속도도 매우 빠릅니다.
- 교차 컴파일 Go 는 컴파일 시 두 개의 매개변수만 간단히 설정하면 다른 플랫폼에서 실행 가능한 프로그램을 컴파일할 수 있습니다.
- 네이티브 并发 Go 언어의 并发 지원은 순수 네이티브이며, 단 하나의 키워드만으로 비동기 코루틴을 시작할 수 있습니다.
- 가비지 컬렉션 Go 는 뛰어난 GC 성능을 가지며, 대부분의 경우 GC 지연은 1 밀리초를 초과하지 않습니다.
- 풍부한 표준 라이브러리 문자열 처리에서 소스 코드 AST 파싱까지, 기능이 풍부하고 강력한 표준 라이브러리는 Go 언어의 견고한 기반입니다.
- 완벽한 툴체인 Go 는 컴파일, 테스트, 의존성 관리, 성능 분석 등 다양한 측면을 아우르는 완벽한 개발 툴체인을 보유하고 있습니다.
Go 언어는 상속을 포기하고 OOP 를 약화시켰으며, 클래스, 메타프로그래밍, 제네릭, Lamda 표현식 등의 특성을 버렸습니다.良好的 성능과 낮은 진입 장벽을 가지며, 클라우드 서비스 개발, 애플리케이션 서버 개발 및 네트워크 프로그래밍에 적합합니다. 내장 GC 를 제공하여 개발자가 수동으로 메모리를 관리할 필요가 없으며, 정적 컴파일과 교차 컴파일은 운영 팀에게도 매우 친화적입니다.
Go 언어의 단점도 많습니다. 예를 들어 논란이 되는 오류 처리, 불완전한 제네릭, 풍부한 표준 라이브러리에도 불구하고 내장 데이터 구조는 몇 개뿐이며, interface{} 타입이 난무하고, 열거형 타입이 없다는 점 등이 있습니다. 그 외에도 Go 개발 팀은 매우 고집스럽고 커뮤니티 의견을 잘 받아들이지 않습니다 (이에 비해 Rust 는 오류 처리, 제네릭, 의존성 관리, 열거형, 인터페이스 등의 측면에서 훨씬 우수합니다).
종합적으로 말하면, 우리는 프로그래밍 언어를 변증법적으로 바라봐야 합니다. 공학화된 언어로서 Go 는 팀의 하한선을 크게 향상시킬 수 있으며, 개발자의 실력이 아무리 낮아도 최소한의 수준을 보장하며, 쥐 한 마리가 죽을 쑤는 경우가 거의 발생하지 않습니다. 동시에 간단한 문법과 낮은 학습 난이도로 인해 프로젝트에 빠르게 적응할 수 있습니다. Go 가 세상에 나온 지 10 여 년도 채 되지 않았지만, 이미 상당수의 회사가 Go 를首选 언어로 채택했으며, 이는 Go 가 점차 유행하고 있음을 간접적으로 보여줍니다.
덧붙여 말하면, Go 는 완전히 오픈소스인 언어로, 커뮤니티와 구글이 공동으로 Go 언어의 발전을 유지보수하고 있습니다. 공식 주소는 구글 저장소에 있으며, Github 에도 동일한 미러 저장소가 있습니다. 관심이 있다면 언어 설계에 참여할 수도 있습니다.
공식 웹사이트: The Go Programming Language
구글 오픈소스 저장소: google/go: Google Open Source
Github 저장소: golang/go: The Go programming language
TIP
필자는 이전에 Go 에 PR 을 제출한 적이 있습니다. Go 에 코드를 기여하는 방법을 알고 싶다면 제가 쓴 이 글을 참고하세요: 如何向 Go 贡献代码.
많은 사람들이 Rust 에 대해 들어봤을 것입니다. Rust 는 고성능 범용 프로그래밍 언어로, 탄생 시기는 Go 보다 1 년 빠릅니다. Go1 의 공식 출시 시기는 2012 년이며, Rust 의 공식 버전 출시 시기는 2015 년입니다. 두 언어 모두 비교적 현대적인 언어로, 발전 분야가 각각 다릅니다. Go 의 실행 효율성과 표현력에 만족하지 못한다면 Rust 를 시도해 보는 것도 좋지만, 학습 난이도는 Go 만큼 간단하지는 않습니다.
설치
Go 언어 다운로드: Downloads - The Go Programming Language

Stable Version 은 현재 유지보수 중인 두 개의 안정 버전을 의미하며, Archived Version 은 더 이상 유지보수되지 않는 역사적 버전을 의미합니다. 업데이트 로그 에서 유지보수 규칙 및 역사 버전 정보에 대해 더 알아보세요.
windows
windows 플랫폼의 경우 installer 와 archive 두 가지 유형을 선택할 수 있습니다. 전자는 설치 패키지로, 클릭만으로 설치할 수 있지만 후자를 사용하는 것이 좋으며, go 언어의 디렉토리 구조에 더 익숙해질 수 있어 향후 문제 발생 시 당황하지 않아도 됩니다. zip 파일을 다운로드하여 선택한 경로에 압축을 풉니다. 압축 파일에는 go 언어의 소스 코드, 툴체인 및 일부 문서가 포함되어 있습니다. 그런 다음 두 개의 시스템 환경 변수를 구성해야 합니다.
- GOROOT - go 언어 설치 경로
- GOPATH - go 언어 의존성 저장 경로
설정이 완료되면 시스템 환경 변수 PATH 에 두 개의 새 항목을 추가합니다.
%GOROOT%\bin: go 바이너리 프로그램 주소%GOPATH%\bin: 향후 서드파티 의존성 바이너리 파일 저장 주소
powershell 에서 go version 명령을 실행하여 정상적으로 버전이 표시되면 설치가 완료된 것입니다.
PS C:\user\username> go version
go version go1.21.3 windows/amd64업데이트는 새로운 zip 파일을 다운로드하여 원래 설치 디렉토리를 덮어쓰기만 하면 됩니다.
linux
ubuntu 를 예로 들어, 원하는 버전의 링크를 복사하여 로컬에 다운로드합니다.
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz지정된 디렉토리에 압축 해제
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gz$HOME/.bashrc 파일에서 환경 변수 설정
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin완료 후 설치 버전 확인
$ go version
go version go1.21.1 linux/amd64업데이트는 새로운 tar.gz 파일을 다운로드하여 원래 설치 디렉토리를 덮어쓰기만 하면 됩니다.
설치 관리
위의 설치 방식은 기본 사용에는 충분하지만, 개인적으로 go 언어 및 그 파생 파일을 저장하기 위해 다음 디렉토리 구조를 사용하는 것을 권장합니다.
go/
|
|--root/
| |
| |--go1.21.3/
| |
| |--go1.20.10/
|
|--mod/
| |
| |--bin/
| |
| |--libs/
|
|--cache/
|
|--temp/
|
|--env의미는 다음과 같습니다.
go/root디렉토리: 각 버전의 go 언어 소스 파일 저장go/mod:GOAPTH에 해당go/mod/libs:GOMODCACHE에 해당, 서드파티 의존성 저장 주소go/mod/bin:GOBIN에 해당, 서드파티 의존성 바이너리 파일 저장 주소go/cache:GOCACHE에 해당, 캐시 파일 저장go/temp:GOTMPDIR에 해당, 임시 파일 저장go/env:GOENV에 해당, 전역 환경 변수 구성 파일
이 방식은 업데이트 시 원래 설치 디렉토리를 덮어쓸 필요가 없으며, 새로운 버전을 go/root 디렉토리에 저장한 후 GOROOT 시스템 환경 변수를 해당 버전의 폴더로 수정하기만 하면 됩니다. 기본적으로 env 파일은 GOROOT/env 경로를 읽으며, GOENV 시스템 변수를 설정하여 GOROOT 와 분리함으로써 버전 변경 시 go 환경 변수 구성의 변화를 피할 수 있습니다. 아래는 env 파일의 초기 설정입니다.
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/temp이는 필자가 선호하는 디렉토리 스타일일 뿐입니다. 命令 - 环境变量 에서 환경 변수에 대한 더 많은 정보를 확인할 수 있으며, 완전히 개인 취향에 따라 커스터마이즈할 수 있습니다.
다중 버전 관리
필자는 govm 라는 다중 버전 관리 도구를 작성했으며, 위의 디렉토리 구조와 함께 사용할 때 가장 효과적입니다. 이 도구는 로컬의 여러 Go 버전을 관리할 수 있으며, 언제든지 버전을 전환할 수 있고 다른 Go 버전을 검색하여 다운로드하여 로컬에 설치할 수도 있습니다.
$ govm search 1.22 -n 10
go1.22.6 76 MB
go1.22.5 76 MB
go1.22.4 76 MB
go1.22.3 76 MB
go1.22.2 76 MB
go1.22.1 76 MB
go1.22.0 76 MB
$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed
$ govm use 1.22.4
Use go1.22.4 now
# 쉘 재로그인
$ go version
go version go1.22.4 windows/amd64Go 로 명령줄 도구를 작성하는 방법을 알고 싶다면 govm 을 프로젝트 참고 자료로 활용해도 좋습니다. govm 도 Go 로 작성되었습니다.
편집기
주류 Go 언어 IDE 는 현재 개인적으로 다음 두 가지만 권장합니다.
- goland: jetbrain 제품, 기능이 강력하고 포괄적인 지원을 제공하지만 유료입니다. IDEA 커뮤니티 에디션과 플러그인 사용을 고려할 수 있습니다.
- vscode: 무료이며 만능 편집기로, 플러그인을 통해 어떤 언어든 작성할 수 있습니다.
다른 편집기를 사용하는 것도 개인의 사용 습관에 맞다면 문제없습니다. 편집기는 중요하지 않으며, 간단한 연습 코드를 작성하는 것뿐이라면 공식에서 제공하는 goplay 를 사용하여 온라인에서 go 코드를 실행해 볼 수 있습니다.
TIP
JetBrains Toolbox 를 사용 중이라면 제가 작성한 명령줄 도구 AutoToolBox 를 시도해 볼 수 있습니다. Toolbox 에 windows 오른쪽 클릭 메뉴를 생성할 수 있으며, 효과는 다음과 같습니다.

격려
Go 언어의 전체 난이도는 높지 않습니다. 다른 언어 기반이 있다면 배우기가 매우 쉽습니다. 학습 과정에서 이해하기 어려운 난점이 있다면 먼저 건너뛰어도 됩니다. 어떤 언어를 배우든 먼저 언어의 대략적인 문법과 구조를 포괄적으로 이해한 후 특성과 세부사항을 깊이 파고드는 것이 좋습니다. 문서의 철학도 이와 같으며, 입문 학습에 적합합니다. 필자 역시 일반 학생에 불과하여 누락이나 오류가 있을 수 있습니다. 어떤 오류를 발견하든 Github 에서 PR 을 제출할 수 있으며, 문서가 괜찮다고 생각되면 Github 에서 Star 를 눌러주세요.
강 OOP 언어 개발자라면 (예: Java, C# 등), OOP 사고방식으로 선입견을 가지지 마십시오. 그렇지 않으면 go 의 많은 설계가 이해하기 어렵고 코드를 작성할 때 매우 불편할 것입니다. 필자도 처음에는 그랬습니다.
개요
아래에서는本站의 내용을 간단히 소개하여 필요에 따라 읽을 수 있도록 하겠습니다. 일부 페이지가 비어있는 것은 아직 업데이트되지 않았음을 의미합니다.
- 언어 입문: 주로 Go 언어 자체에 대한 내용을讲解하며, 이론에 치중합니다.
- 커뮤니티 생태: 주로 Go 관련 생태계를讲解하며, 응용에 치중합니다.
- 데이터베이스: Go 를 통해 주요 데이터베이스를 조작하는 방법을 소개합니다.
- 마이크로서비스: Go 와 관련된 마이크로서비스 도구를 소개합니다.
- 서드파티 라이브러리: Go 로 작성된 서드파티 라이브러리를 소개하며,随缘 업데이트합니다. 또는 의존성 네비게이션 에서 직접 확인할 수도 있습니다.
준비 시작 에서 입문 학습을 진행하세요.
