Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

(2019년 5월 5일)현재 Go의 최신 버전은 1.12.4이다. 이전 문서는 1.9.1 기준이었는데, 1.11 버전이후로 Go의 패키지 관리 정책이 변경됐다. Go 패키지 관리 방식에 큰 변화가 생겼으므로 변경점에 맞춰서 새로 작성하기로 했다.

환경

이 문서의 내용은 우분투리눅스 18.04를 기준으로 한다. 우분투 리눅스가 기준인 이유는 그냥 내가 리눅스 개발자라서이다.
# cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

GoLang 설치

The Go Programming Language Downloads페이지에서 운영체제별 최신버전을 다운로드 할 수 있다. go1.12.4.linux-amd64.tar.gz 을 다운로드 한다. 다운로드한 파일은 /usr/local 디렉토리에서 압축을 풀었다.
# cd /usr/local/
# wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
# tar -xvzf go1.12.4.linux-amd64.tar.gz
이제 /usr/local/go 디렉토리가 만들어졌을 것이다. go 툴들을 사용 할 수 있도록 환경변수 PATH를 설정한다. .bash_profile을 수정해서 로그인 시점에서 자동으로 환경변수가 설정되도록 했다.
# cat ~/.bash_profile 
export PATH=/usr/local/go/bin:$PATH

# source ~/.bash_profile
go 버전을 확인해 보자.
# which go
/usr/local/go/bin/go

# go version
go version go1.12.4 linux/amd64

hello world 프로그램을 만든다음 빌드하고 실행해 보자. 나는 ~/workspace/go/helloworld 디렉토리 밑에 main.go 파일을 만들었다.
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}
# go build
# ./helloworld
Hello World

이 것으로 설치는 완료 했다.

개발 환경 꾸미기

IDE 선택

Go 개발환경으로 널리 사용하는 IDE는 아래와 같다.
  1. VIM : 순위를 내놓는 커뮤니티의 특성에 따라서 추천 IDE가 달라질 수는 있지만, 커뮤니티를 막론하고 VIM은 3손가락안에 드는 IDE다. 나 역시 VIM을 사용한다. VIM-GO, YCM, NerdTree 등 수많은 플러그인을 통해서 강력한 개발환경을 구성할 수 있다. 적응하는데 약간의 시간이 든다는 점과 제대로 사용하려면 그에 비례해서 더 많은 시간이 들어간다는 점이 단점이다. 완전한 터미널 환경이라는 것이 진입장벽으로 작용하기도 한다. 이 문서는 Vim 기반으로 개발 환경을 설명한다.
  2. Visual Studio code. VIM과 함께 가장 널리 사용하는 IDE다. Go extension을 이용해서 확장하는 방식이다. VIM 만큼 널리 사용하고 있는 것 같아서, VS Code를 세팅해본 적이 있다. 아무래도 나에게는 Vim이 더 맞는 것 같아서 VS Code는 그냥 건너 뛰었다. GUI 툴에 익숙하다면 좋은 툴이 될 것이다.
  3. JetBrains의 GoLand. 상용 IDE 중에서는 가장 인기 있는 제품이다. 그리고 보통 최고의 상용 IDE 라고 평가한다. 안써봐서 모르겠지만... 좋겠지 싶다.
VIM Go 개발환경 설정을 힘들어하는 사용자를 위해서 설정 템플릿 Vim go ide을 배포하기도 한다.

VIM-GO 설치

 Vim go 마스코트

vim-go는 go 소프트웨어 개발을 위한 vim 플러그인이다. 아래와 같은 기능들을 가지고 있다.
  • :GoBuild, :GoInstall, :GoTest, :GoTestFunc 등을 이용해서 vim 안에서 컴파일, 인스톨, 테스트, 단일 함수테스트를 수행 할 수 있다.
  • :GoRun 으로 바로 코드를 실행 할 수 있다.
  • 향상된 구문강조(syntax highlighting)와 폴딩
  • 디버깅 툴인 delve를 통합하고 있다. :GoDebugStart를 이용해서 디버깅 할 수 있다.
  • :GoDef 를 이용해서 심볼및 선언(declaration)으로 이동 할 수 있다.
  • :GoDoc, :GoDocBrowser 로 패키지 문서를 탐험할 수 있다.
  • :GoRename 을 이용해서 이름을 안전하게 바꿀 수 있다.
  • :GoCoverage 테스트 커버리지 측정.
  • :GoLint 를 이용한 오류검사, :GoVert 로 정적 오류 탐지, :GoErrCheck 로 오류 검사
  • :GoImplements, :GoCallees, :GoReferrers 와 같은 고급 분석 도구
Pathogon
Pathogon은 vim 플러그인과 런타임 파일을 쉽게 관리 할 수 있도록 도와주는 vim 환경관리 툴이다. 먼저 pathogon을 설치한다.
# mkdir -p ~/.vim/autoload
# mkdir -p ~/.vim/bundle
~/.vim/autoload 디렉토리 밑에 vim-pathogon을 클론(clone)한다.
# git clone https://github.com/tpope/vim-pathogen.git
Cloning into 'vim-pathogen'...
pathogen.vim을 ~/.vim/autoload 디렉토리에 복사한다.
# cp vim-pathogen/autoload/pathogen.vim ./

아래와 같이 vim-go 스크립트를 다운로드 한다.
# git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go
Cloning into '/root/.vim/bundle/vim-go'...

아래와 같이 .vimrc를 설정한다.
# cat ~/.vimrc 
execute pathogen#infect()
syntax on
filetype plugin indent on

vim을 실행하고 :GoInstallBinaries명령을 실행하면, vim-go 관련된 플러그인들이 자동으로 설치된다.
# vim
:GoInstallBinaries
vim-go: gogetdoc not found. Installing github.com/zmb3/gogetdoc to folder /go/bin/
vim-go: guru not found. Installing golang.org/x/tools/cmd/guru to folder /go/bin/
vim-go: gopls not found. Installing golang.org/x/tools/cmd/gopls to folder /go/bin/
vim-go: fillstruct not found. Installing github.com/davidrjenni/reftools/cmd/fillstruct to folder /go/bin/
vim-go: godef not found. Installing github.com/rogpeppe/godef to folder /go/bin/
vim-go: motion not found. Installing github.com/fatih/motion to folder /go/bin/
vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder /go/bin/
vim-go: dlv not found. Installing github.com/go-delve/delve/cmd/dlv to folder /go/bin/
vim-go: gocode not found. Installing github.com/mdempsky/gocode to folder /go/bin/
....

자동완성

YouCompleteMe(이하 YCM)은 VIM을 위한 자동코드완성 엔진이다. YCM은 C,C++,Object-C,Object-C++,CUDA,Python2,Pyton3,C#,Go 등 다양한 언어에 대한 자동완성기능을 제공한다.

YCM을 설치하기 위해서 python-dev, cmake 패키지를 설치한다.
# sudo apt-get install python-dev
# sudo apt-get install cmake

YCM을 클론하고 컴파일 한다. Go 자동완성을 지원하고 싶다면 --go-completer 를 컴파일 옵션으로 설정해야 한다.
# cd ~/.vim/bundle
# git clone https://github.com/Valloric/YouCompleteMe.git
# cd ~/.vim/bundle/YouCompleteMe
# git submodule update --init --recursive
# ./install.sh --go-completer 
테스트 결과.

Tagbar

Tagbar 플러그인을 이용해서 현재 파일의 태그를 탐색해서, 코드의 대략적인 구조를 빠르게 살펴볼수 있다.
# cd ~/.vim/bundle
# git clone https://github.com/majutsushi/tagbar.git

NerdTree

NERDTree는 Vim용 파일 탐색기다. 이 플러그인은 디렉토리의 구조를 계층적으로 보여줘서, 파일을 쉽게 탐색하고 편집할 수 있도록 도와준다.
# cd ~/.vim/bundle
# git clone https://github.com/scrooloose/nerdtree.git

최종 개발 환경

아래와 같은 개발 환경을 만들었다.

 개발환경