Goのインストール

mako|2017年08月16日
Go

ランサーズでは定期的にプログラミング言語Go読書会を開催しています。

https://lancers-engineer.connpass.com/

プログラミング言語Go(丸善出版)を読み進め、不明な点や疑問点について議論し理解を深めています。

Goのインストールから実行までを行い、何が起こっているか少し調べながら触ってみました。
実行環境はmacOS Sierraです。

インストール

  • Homebrewによるインストール
  • パッケージによるインストール

2種類の方法でインストールを確認しました。
インストールの方法により作成されるディレクトリやデフォルトの環境変数が違うようです。
パッケージのインストーラーは公式サイトからのダウンロードですが、Homebrewでのインストールは最新バージョンでない可能性もあるためインストールする前にバージョンの確認をした方がよいかと思います。

Homebrewによるインストール

確認時のバージョンは1.8.3

$ brew info go

go: stable 1.8.3 (bottled), devel 1.9rc2, HEAD
Open source programming language to build simple/reliable/efficient software
https://golang.org
/usr/local/Cellar/go/1.8.3 (7,035 files, 282.0MB) *

インストール

$ brew install go

Updating Homebrew…
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
sane-backends

==> Downloading https://homebrew.bintray.com/bottles/go-1.8.3.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.8.3.sierra.bottle.tar.gz
==> Caveats
A valid GOPATH is required to use the `go get` command.
If $GOPATH is not specified, $HOME/go will be used by default:
https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
? /usr/local/Cellar/go/1.8.3: 7,035 files, 282.0MB

インストールしたバージョン

$ go version
go version go1.8.3 darwin/amd64

デフォルトのGo環境変数(一部)

$ go env

GOARCH=”amd64″
GOBIN=””
GOEXE=””
GOHOSTARCH=”amd64″
GOHOSTOS=”darwin”
GOOS=”darwin”
GOPATH=”/Users/ma/go”
GORACE=””
GOROOT=”/usr/local/Cellar/go/1.8.3/libexec”
GOTOOLDIR=”/usr/local/Cellar/go/1.8.3/libexec/pkg/tool/darwin_amd64″
GCCGO=”gccgo”

goのパスを探す

$ which go
/usr/local/bin/go

goのパスを確認

/usr/local/bin/goについて、ディレクトリの確認をするとシンボリックリンクになっていました。

$ ls -l /usr/local/bin|grep go

lrwxr-xr-x 1 ma admin 25 8 12 23:47 go -> ../Cellar/go/1.8.3/bin/go
lrwxr-xr-x 1 ma admin 28 8 12 23:47 godoc -> ../Cellar/go/1.8.3/bin/godoc
lrwxr-xr-x 1 ma admin 28 8 12 23:47 gofmt -> ../Cellar/go/1.8.3/bin/gofmt

$ ls -l /usr/local/Cellar/go/1.8.3/bin/go

lrwxr-xr-x 1 ma staff 17 5 25 03:15 /usr/local/Cellar/go/1.8.3/bin/go -> ../libexec/bin/g

$ ls -l /usr/local/Cellar/go/1.8.3/bin/go
lrwxr-xr-x 1 ma staff 17 5 25 03:15 /usr/local/Cellar/go/1.8.3/bin/go -> ../libexec/bin/go

シンボリックリンクになっていることから
/usr/local/bin|goのパスは
-> /usr/local/Cellar/go/1.8.3/bin/go
-> /usr/local/Cellar/go/1.8.3/libexec/bin/go
=> GOROOT/bin/go
GOROOT/bin/goにリンクされていることになります。

アンインストール

Goをアンインストールするときは、インストールの時と同様に
brew uninstall go
のコマンドから実行できます。

$ brew uninstall go

Uninstalling /usr/local/Cellar/go/1.8.3… (7,035 files, 282.0MB)

アンインストールすると/usr/local/bin/goが消えています。

$ ls -l /usr/local/bin/|grep go
$ ls -l /usr/local/Cellar/go/1.8.3/bin/
ls: /usr/local/Cellar/go/1.8.3/bin/: No such file or directory

 

/usr/local/Cellar/go/1.8.3ディレクトリを削除した場合、アンインストールをすることができなくなります。

$ sudo rm -rf /usr/local/Cellar/go/1.8.3

$ brew uninstall go
Error: No such keg: /usr/local/Cellar/go

削除したディレクトリを再作成するとアンインストールすることができるようになりますが、
/usr/local/bin/以下が削除されずに残ってしまいます。

$ mkdir /usr/local/Cellar/go/1.8.3

$ brew uninstall go
Uninstalling /usr/local/Cellar/go/1.8.3… (68B)

$ ls -l /usr/local/bin/|grep go
lrwxr-xr-x 1 ma admin 25 8 13 16:49 go -> ../Cellar/go/1.8.3/bin/go
lrwxr-xr-x 1 ma admin 28 8 13 16:49 godoc -> ../Cellar/go/1.8.3/bin/godoc
lrwxr-xr-x 1 ma admin 28 8 13 16:49 gofmt -> ../Cellar/go/1.8.3/bin/gofmt

/usr/local/Cellar/go/1.8.3/bin/を削除した場合はアンインストールはできますが、
同様に/usr/local/bin/以下が削除されずに残ってしまいます。

$ sudo rm -rf /usr/local/Cellar/go/1.8.3/bin/

$ brew uninstall go
Uninstalling /usr/local/Cellar/go/1.8.3… (7,032 files, 282.0MB)

$ ls -l /usr/local/bin/|grep go
lrwxr-xr-x 1 ma admin 25 8 13 16:49 go -> ../Cellar/go/1.8.3/bin/go
lrwxr-xr-x 1 ma admin 28 8 13 16:49 godoc -> ../Cellar/go/1.8.3/bin/godoc
lrwxr-xr-x 1 ma admin 28 8 13 16:49 gofmt -> ../Cellar/go/1.8.3/bin/gofmt

/usr/local/Cellar/go/1.8.3/bin/goを削除した場合も、同様にアンインストールはできます。

$ ls -l /usr/local/Cellar/go/1.8.3/bin/
total 24
lrwxr-xr-x 1 ma staff 17 5 25 03:15 go -> ../libexec/bin/go
lrwxr-xr-x 1 ma staff 20 5 25 03:15 godoc -> ../libexec/bin/godoc
lrwxr-xr-x 1 ma staff 20 5 25 03:15 gofmt -> ../libexec/bin/gofmt

$ sudo rm -rf /usr/local/Cellar/go/1.8.3/bin/go

$ brew uninstall go
Uninstalling /usr/local/Cellar/go/1.8.3… (7,034 files, 282.0MB)

/usr/local/Cellar/go/1.8.3/bin/goだけ削除しましたが、
・/usr/local/Cellar/go/1.8.3/bin/godoc
・/usr/local/Cellar/go/1.8.3/bin/gofmt
は残した状態でアンインストールしたため
・/usr/local/bin/godoc
・/usr/local/bin/gofmt
はアンインストール時に削除されています。

$ ls -l /usr/local/bin/|grep go
lrwxr-xr-x 1 ma admin 25 8 13 16:43 go -> ../Cellar/go/1.8.3/bin/go

 

パッケージによるインストール

インストール

下記リンクのパッケージをダウンロードして、インストーラー手順に従って進めばインストールできます。
https://golang.org/dl/

インストールしたバージョン

$ go version
go version go1.8.3 darwin/amd64

デフォルトのGo環境変数(一部)

$ go env
GOARCH=”amd64″
GOBIN=””
GOEXE=””
GOHOSTARCH=”amd64″
GOHOSTOS=”darwin”
GOOS=”darwin”
GOPATH=”/Users/ma/go”
GORACE=””
GOROOT=”/usr/local/go”
GOTOOLDIR=”/usr/local/go/pkg/tool/darwin_amd64″
GCCGO=”gccgo”

Goのパス

$ which go
/usr/local/go/bin/go

アンインストール

アンインストールをするときは、コマンドではなく以下を削除すればできます。
/usr/local/go
/etc/paths.d/go

実行

コンパイルによる実行

ビルド

複数ファイルのビルド

goのファイル作成

$ vi hello_goodby/main.go

package main

func main() {
    goodby()
    hello()
}

$ vi hello_goodby/hello.go
 
package main
import “fmt”
 
func hello() {
    fmt.Printf(“hello,world!!\n”)
}

$ vi hello_goodby/goodby.go
 
package main
import “fmt”
 
func goodby() {
    fmt.Printf(“goodby,world!!\n”)
}

$ ls hello_goodby/
goodby.go hello.go main.go

ビルド

hello_goodbyディレクトリに移動して

$ cd hello_goodby

$ go build

を叩くとコンパイルされたバイナリファイルhello_goodbyが作成されます。
goファイルが置かれたディレクトリ名がバイナリファイルの名前となりました。

$ ls hello_goodby/
goodby.go hello.go hello_goodby main.go

※ ちなみに-xをつけてビルドするとコマンドが出力されます。

$ go build -x

WORK=/var/folders/hs/th0r_7x90tg_6xzpv_b_38740000gn/T/go-build913507608
mkdir -p $WORK/_/Users/ma/work/hello_goodby/_obj/
mkdir -p $WORK/_/Users/ma/work/hello_goodby/_obj/exe/
cd /Users/ma/work/hello_goodby
/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/_/Users/ma/work/hello_goodby.a -trimpath $WORK -p main -complete -buildid e1538f27346c5897d51eb81f7426a56b04b5ccf6 -D _/Users/ma/work/hello_goodby -I $WORK -pack ./goodby.go ./hello.go ./main.go
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/_/Users/ma/work/hello_goodby/_obj/exe/a.out -L $WORK -extld=clang -buildmode=exe -buildid=e1538f27346c5897d51eb81f7426a56b04b5ccf6 $WORK/_/Users/ma/work/hello_goodby.a
mv $WORK/_/Users/ma/work/hello_goodby/_obj/exe/a.out hello_goodby

一つのファイルをビルド

一つのファイルをビルドすると、ビルドしたgoファイルと同じ名前のバイナリファイルが作成されます。

$ vi hello.go
 
package main
import “fmt”
 
func main() {
    fmt.Printf(“hello,world!!\n”)
}

$ go build hello.go

$ ls
hello hello.go

実行

作成されたバイナリファイルを叩くだけで実行されます。

$ ./hello_goodby

hello,world!!
goodby,world!!

go run による実行

ファイル作成

$ vi hello.go
 
package main
import “fmt”
 
func main() {
    fmt.Printf(“hello,world!!!\n”)
}

go runによるファイル実行を行うと、コンパイルした一時的なバイナリファイルを直接実行することができます。

$ go run hello.go
hello,world!!!

※ ちなみに -workを付けるとコンパイルされたバイナリを削除せずに残され、そのパスが表示されます。

$ go run -work hello.go
WORK=/var/folders/hs/th0r_7x90tg_6xzpv_b_38740000gn/T/go-build768576767