Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Go 언어 설치

Go 언어를 공부해야지 하고는 책을 반 정도 보다가 멈추고 너무 시간이 흘러서 처음부터 다시 보고 있다. 전에는 뭔가 책을 다 보고 정리해야지 하다가 결국 아무것도 정리를 못 해서 이번에 새로운 마음으로 설치부터 정리해 보려고 한다. 물론 내가 macOS를 써서 macOS 기준이다. 설치가 어렵지는 않지만 (내 경험 기준으로는) 다른 언어와 다른 부분이 있어서 처음에 좀 헷갈렸다.

Go 언어 설치

다운로드 페이지에서 운영체제에 맞는 설치파일(macOS라면 pkg 파일)을 받을 수 있는데 언어 환경 등은 직접 관리하는 걸 더 선호하는 편이라 go1.9.3.darwin-amd64.tar.gz 파일을 다운받았다. 이 파일의 압축을 풀면 go 폴더가 생기면서 그 아래 go 언어 관련 파일이 생기게 된다. 이 파일을 ~/env 아래 풀었다고 하면 go 파일 등은 ~/env/go/bin 아래 존재하게 된다. 이 폴더 아래 go 뿐만 아니라 godoc, gofmt도 있는데 아무 곳에서나 이 파일을 사용하려면 PATH에 추가해야 한다.

$ export PATH=$PATH:~/env/go/bin

go 바이너리를 PATH에 제대로 추가하고 버전을 출력해서 정상적으로 설정되었는지 확인할 수 있다.

$ go version
go version go1.9.3 darwin/amd64


GOROOT

GO 언어로 개발을 하려면 몇 가지 환경설정을 해야 한다. 보통 책을 보면 가장 먼저 언급되는 게 GOROOT 환경변수인데 기본으로 설치하면(아마 pkg로 설치하면 이렇게 설치되겠지) /usr/local/go에 설치가 되고 이 경우에는 상관없지만, 위에서 한 것처럼 바이너리를 다운받아서 다른 경로에 Go를 설치한 경우에는 GOROOT를 go를 설치한 폴더로 지정해야 한다고 나와 있다.(이 경우에는 ~/env/go) 내가 본 책에도 그렇게 나와 있었고 Go 언어 홈페이지에도 다른 경로에 설치하면 GOROOT 환경변수를 반드시 설정해야 한다고 나와 있다.

The Go binary distributions assume they will be installed in /usr/local/go (or c:\Go under Windows), but it is possible to install the Go tools to a different location. In this case you must set the GOROOT environment variable to point to the directory in which it was installed.

하지만 You don’t need to set GOROOT, really를 봐도 필수로 설정하지 않아도 되는 것 같고 아래처럼 확인해 보면 GOROOT 환경변수 없이도 go 바이너리가 GOROOT를 잘 찾은 것을 알 수 있다. 더 복잡한 경우에 문제가 생길지도 모르겠지만 일단은 GOROOT를 따로 설정하지 않고 사용하기로 했다.

$ go env GOROOT
/Users/outsider/env/go


GOPATH

GOPATH는 Go 언어로 된 프로젝트를 사용하거나 개발할 때 사용할 워킹 디렉터리를 가리키는 환경변수다. 처음 Go 언어를 사용할 때 가장 어색하게 느낀 부분이었다. 나는 개발할 때 로컬에 projects 폴더를 만들어 두고 이 아래 언어별로 나누거나 용도(문서, 오픈소스 기여, 공부용) 등으로 나누어서 관리하고 있다. 각 개별 폴더는 관리상의 목적일 뿐 위치가 중요한 건 아니라서 필요에 따라 다시 정리하거나 다른 폴더 밑으로 옮기기도 하는 편이다. 하나의 폴더가 한 프로젝트를 모두 담고 있으니까...

근데 Go는 이런 내 관례와는 달리 Go 언어용 워킹 디렉터리를 만든 다음에 그 아래에서 go의 관례에 따라 폴더구조가 생기고 개발하도록 하고 있다. 이 부분이 엄청 이상해서 처음에는 그냥 내가 사용하는 대로 폴더를 만들어서 사용하려고 해봤지만, 고생만 하고 제대로 되지 않았다. 결국, 그냥 Go 언어가 안내하는 대로 GOPATH를 설정해서 사용하기로 했다.

~/projects/go 디렉터리를 만들고 이곳을 워킹 디렉터리로 사용한다고 하면 다음과 같이 GOPATH 환경변수를 잡아주어야 한다.

$ export GOPATH=$PATH:~/projects/go

go 관련 도구들을 설치하기 위해서 다음 명령어를 실행해 보자.

$ go get golang.org/x/tools/cmd/...

이 도구들은 GOPATH에 설정된 경로에 설치되는데 아래와 같이 폴더가 3개 생긴다.

├── bin
├── pkg
└── src
  • bin/: go 프로젝트의 실행 파일이 여기에 생성된다. 내가 작성한 Go 프로젝트도 설치하면 실행 파일이 여기에 들어간다.
  • pkg/: 컴파일된 패키지의 오브젝트 파일이 여기에 들어간다.
  • src/: go 프로젝트의 소스 파일이 여기에 들어간다.

여기서 실행 파일이 $GOPATH/bin에 생기므로 다른 곳에서도 이 실행 파일을 사용하려면 PATH$GOPATH/bin을 추가해야 한다.

src 디렉터리는 go의 관례를 따르는데 go 패키지를 가져오는 경로가 이 아래 똑같이 생긴다. 그래서 위에서 패키지를 설치하는 go get 명령어로 golang.org/x/tools/cmd/...를 설치하면 이 소스 파일은 src/golang.org/x/tools 아래 생기게 된다. golang도 이렇게 프로젝트를 관리할 때 배포되는 프로젝트의 위치를 따르게 되고 내가 작성하는 프로젝트에서 다른 go 라이브러리를 가져와도 이 관례에 따라 GOPATH아래 설치된다.

Hello World

내가 GitHub에 godemo라는 프로젝트를 시작한다면 src/github.com/outsideris/godemo라고 디렉터리를 만들어서 개발을 해야 한다.(내 GitHub 아이디가 outsideris 이다.) 이런 구조로 만드는 게 무척 어색했지만 이렇게 해야 다른 환경이랑 충돌도 생기지 않는다. 간단한 Hello World 프로그램을 $GOPATH/src/github.com/outsideris/godemo/hello.go 에 만들어 보자.

// src/github.com/outsideris/godemo/hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello, world.\n")
}

go run 명령어로 이 파일을 실행할 수 있다.

$ go run hello.go
Hello, world.

go install 명령어를 사용하면 이 프로젝트를 패키지로 설치할 수 있다.

$ go install github.com/outsideris/godemo

설치가 완료되면 $GOPATH/bin/ 아래 godemo 실행 파일이 생겨서 다음과 같이 아무 곳에서나 이 패키지를 실행할 수 있다.

$ godemo
Hello, world.
2018/02/11 21:29 2018/02/11 21:29