はじめに
Go 公式サイトのパッケージ(.pkg)、Homebrew(ホームブルー)、goenv(ゴーエンブ)から開発環境を構築して Hello, world! を出力する 3 つの方法を解説しています。これから Go を始めてみたい初心者にもわかるように、詰まりやすいポイントや注意点なども説明しています。
検証環境
- macOS Big Sur 11.5.2
解説
Go 言語の開発環境を構築するには、下記のような 3 つの方法があります。
各方法で Go をインストールして Hello, world! を出力するところまでを説明します。
公式サイトのパッケージでインストールする方法
公式サイトの Download and install と手順は同じです。
まずは、公式サイトから提供されている .pkg(パッケージ)をダウンロードします。
ダウンロードした .pkg を開くとインストーラーが起動するので「続ける」をクリックします。
このホリネズミのキャラクターは Gopher(ゴーファー)という名前で、Go 言語のマスコットキャラクターです。
「続ける」をクリックします。
「インストール」をクリックします。
ソフトウェアのインストールを許可します。
インストールが始まるので、完了するまで待ちます。
インストールが完了したら「閉じる」をクリックします。
インストール先を変更していなければ /usr/local/go
に Go がインストールされています。
次は、コマンドサーチパスを確認します。この辺りは初学者が混乱しやすいところなので、少し細かく説明します。
コマンドサーチパスとは、実行ファイル名でコマンドを実行できるサーチパス(検索パス)のことです。
実行ファイルとは、コマンドの実体となるファイルのことです。
例えば、pwd
(print working directory)コマンドは /bin/pwd
と入力しても実行できるように、/bin
ディレクトリにコマンドと同名のファイルが存在しています。
この実行ファイルまでのパスを省略できるようにしているのがサーチパスです。
そして、サーチパスを保存している環境変数が PATH です。環境変数(environment variable)とは、OS(Operating System)全体で使える変数のことです。
つまり、pwd
コマンドを /bin/pwd
と入力しないで pwd
だけで実行できるのは、サーチパスを PATH に保存しているからできたということです。やっておいた方があとあと楽ですね。
因みに、PATH にサーチパスを新たに設定することを PATH を通す と言います。
ターミナルを再起動して、echo コマンドで PATH を出力します。
echo $PATH
下記のような実行結果が出力されると思います。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
:
は区切りです、見やすくすると下記のようになります。
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/go/bin
デフォルトでは /usr/local/go/bin
が設定されています。
設定に問題が無ければ go version
コマンドで Go のバージョンが出力されます。
go version
go env
コマンドで GOPATH の確認をします。GOPATH とは、Go のワークスペースディレクトリの場所のことです。
go env GOPATH
デフォルトで /Users/ユーザー名/go
に設定されていることがわかります。ユーザー名の部分に takuya
などの文字列が入ります。
GOPATH は任意の場所に指定して問題ありませんが、設定していないと一部のツールが動作しないことがあるので気を付けましょう。
GOPATH に合わせて mkdir
(make directory)コマンドで go ディレクトリを作成します。
mkdir ~/go
GOPATH を変更したい場合は export
コマンドで GOPATH の場所を指定できます。
export GOPATH=$HOME/go
1 つ注意点があって、GOPATH にホームディレクトリを指定すると他のファイルやディレクトリと混在するので、よっぽど急ぎでなければディレクトリを作成することをオススメします。
次は Hello, World! と出力するプログラムを作成します。公式サイトの Tutorial: Get started with Go に情報がありますが、もう少し簡単なやり方を説明します。
下記のシンプルなコードを記述した hello.go という名前のファイルを作成します。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world!\n")
}
このファイルを Go のワークスペースディレクトリに移動します。
cd
(change directory)コマンドで、カレントディレクトリをワークスペースディレクトリに変更します。
cd ~/go
go run
コマンドでパッケージをコンパイル(Compile)して実行します。
Go はコンパイル言語なので、ソースコードをバイナリコードに変換する必要があります。この機械語に翻訳することをコンパイルといいます。
go run hello.go
下記のように Hello, world! と出力されます。
Hello, world!
カレントディレクトリ以下のファイルも読み込む場合は、go build
コマンドで一旦コンパイルしてから実行します。
go build hello.go
./hello
Go をアンインストールする場合は、公式サイトの Uninstalling Go に情報があります。
rm コマンドで Go をインストールした /usr/local/go
と PATH の /etc/paths.d/go
を削除するだけです。
sudo rm -rf /usr/local/go
sudo rm -rf /etc/paths.d/go
Homebrew でインストールする方法
まずは、既に Homebrew(ホームブルー)がインストールされていないか brew -v
コマンドでバージョンを確認しましょう。
brew -v
Homebrew をインストールする方法は、インストール に情報があります。リンク先のコマンドをコピーして、ターミナルで実行するだけです。
既に Homebrew がインストールされている場合は、brew update
コマンドで最新の formulae(フォーミュラ)を取得しておきましょう。formulae とは、パッケージ定義のことです。
brew update
次は brew upgrade
コマンドで formulae を更新します。
brew upgrade
brew cleanup
コマンドで古いバージョンのキャッシュクリアをやっておきましょう。
brew cleanup
Homebrew が更新されているか brew -v
コマンドでバージョンを確認します。
brew -v
最新の Homebrew にできたら brew install go
コマンドで Go をインストールします。
brew install go
ちゃんと Go がインストールされているか go version
コマンドでバージョンを確認しましょう。
go version
go env GOROOT
コマンドで Go のインストールパスを確認します。
go env GOROOT
/usr/local/Cellar/go/バージョン/libexec
のようになっていると思います。バージョンの部分には 1.17.1
のような文字列が入ります。
GOROOT 以下の /bin
に実行ファイルがあるので、必要に応じて PATH を通します。
go env GOPATH
コマンドで GOPATH を確認します。
go env GOPATH
デフォルトで /Users/ユーザー名/go
に設定されていることがわかります。
mkdir コマンドで go ディレクトリを作成します。
mkdir ~/go
次は、Hello, World! と出力するプログラムを作成します。下記のシンプルなコードを記述した hello.go という名前のファイルを作成します。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world!\n")
}
このファイルを Go のワークスペースディレクトリに移動します。
cd
コマンドで、カレントディレクトリをワークスペースディレクトリに変更します。
cd ~/go
go run
コマンドでパッケージをコンパイルして実行します。
go run hello.go
下記のように Hello, world! と出力されます。
Hello, world!
Go をアンインストールする場合は brew uninstall go
コマンドを実行します。
brew uninstall go
goenv でインストールする方法
goenv のインストール方法は、公式サイトの Basic GitHub Checkout と Homebrew on Mac OS X に情報があります。
2 通りの方法がありますが、最新の Go バージョンを使う必要があるなら Git から goenv をクローンしましょう。最新にする必要が無ければ Homebrew(ホームブルー)からインストールして問題ありません。
理由は、goenv のバージョンには 1 系(1.x.x)と 2 系(2.x.x)があって、現在は Homebrew からインストールすると 1 系になります。最新の更新は 2 系に反映しているので、1 系でインストールできる Go バージョンリストには最新のバージョンがないからです。
2 つのやり方を説明します。
Git から goenv をインストールする方法
公式サイトの Basic GitHub Checkout と手順は同じです。
既に Homebrew で goenv をインストールしていて、1 系から 2 系にバージョンアップしたい場合は brew uninstall goenv
コマンドで goenv をアンインストールして、rm
コマンドで ~/.goenv
を削除します。
brew uninstall goenv
sudo rm -rf ~/.goenv
ここからは goenv をインストールしていない場合と同じです。
git clone
コマンドで goenv の Git リポジトリをコピーします。
git clone https://github.com/syndbg/goenv.git ~/.goenv
goenv の PATH を通します。.bash_profile
とは、ターミナル起動時に読み込まれる環境設定を設定するファイルのことです。
echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bash_profile
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(goenv init -)"' >> ~/.bash_profile
exec $SHELL
コマンドで PATH の変更が有効になるようにシェルを再起動、又はターミナルを再起動します。
exec $SHELL
goenv install -l
コマンドでインストールできる Go のバージョンリストを出力します。
goenv install -l
必要な Go のバージョンを goenv install
コマンドに指定してインストールします。
goenv install 1.17.1
新しいバージョンの Go をインストールした後は goenv rehash
コマンドを実行しましょう。
goenv rehash
goenv global
コマンドで使用する Go のバージョンを設定します。~/.goenv/version
ファイルにバージョン名を書き込み、全てのシェルで使用される Go のグローバルバージョンを設定しています。
goenv global 1.17.1
goenv versions
コマンドでインストールした Go のバージョンリストと現在設定されているバージョンを確認できます。
goenv versions
goenv に GOPATH と GOROOT を管理させる場合は、eval "$(goenv init -)"
の後に PATH を通します。
echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.bash_profile
exec $SHELL
コマンドで PATH の変更が有効になるようにシェルを再起動、又はターミナルを再起動します。
exec $SHELL
go env GOPATH
コマンドで GOPATH を確認します。
go env GOPATH
Go のワークスペースディレクトリが /Users/ユーザー名/go/バージョン
に設定されていることがわかります。
GOPATH に合わせて mkdir
コマンドでディレクトリを作成します。
mkdir ~/go
mkdir ~/go/1.17.1
次は、下記のような Hello, World! と出力するプログラムを作成します、ファイル名は hello.go
にしましょう。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world!\n")
}
このファイルを Go のワークスペースディレクトリに移動します。
cd
コマンドでカレントディレクトリをワークスペースディレクトリに変更します。
cd ~/go/1.17.1
go run
コマンドでパッケージをコンパイルして実行します。
go run hello.go
下記のように Hello, world! と出力されます。
Hello, world!
goenv をアップグレードする方法は、公式サイトの Upgrading に手順があります。カレントディレクトリを cd $(goenv root)
に変更して git pull
コマンドを実行するだけです。
cd $(goenv root)
git pull
goenv をアンインストールする方法は、公式サイトの Uninstalling goenv に手順があります。rm -rf `goenv root`
コマンドを実行するだけです。
rm -rf `goenv root`
Homebrew から goenv をインストールする方法
公式サイトの Homebrew on Mac OS X と手順は同じです。
brew install goenv
コマンドで goenv をインストールします。
brew install goenv
ちゃんと goenv がインストールされているか goenv -v
コマンドでバージョンを確認します。
goenv -v
eval
コマンドで goenv の PATH を通します。
eval "$(goenv init -)"
ターミナルを再起動する度に PATH を通すのが面倒な場合は、.bash_profile
にコマンドを設定します。
echo 'eval "$(goenv init -)"' >> ~/.bash_profile
PATH の変更後は exec $SHELL
コマンドでシェルを再起動、又はターミナルの再起動を忘れずに。
exec $SHELL
goenv install -l
コマンドでインストールできる Go バージョンリストを出力します。
goenv install -l
必要な Go のバージョンを goenv install
コマンドに指定してインストールします。
goenv install 1.11.4
goenv versions
コマンドでインストールした Go のバージョンリストを出力できます。
goenv versions
goenv global
コマンドで使用する Go のバージョンを設定します。
goenv global 1.11.4
新しいバージョンの Go をインストールした後は goenv rehash
コマンドを実行します。
goenv rehash
再度 goenv versions
コマンドを実行すると、現在設定されている Go のバージョンがわかります。
goenv versions
go env GOPATH
コマンドで GOPATH を確認します。
go env GOPATH
デフォルトで /Users/ユーザー名/go
に設定されていることがわかります。
mkdir コマンドで go ディレクトリを作成します。
mkdir ~/go
次は、下記のような Hello, World! と出力するプログラムを作成します、ファイル名は hello.go
にしましょう。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world!\n")
}
このファイルを Go のワークスペースディレクトリに移動します。
cd
コマンドで、カレントディレクトリをワークスペースディレクトリに変更します。
cd ~/go
go run
コマンドでパッケージをコンパイルして実行します。
go run hello.go
下記のように Hello, world! と出力されます。
Hello, world!
goenv をアップグレードする方法は、brew upgrade --fetch-HEAD goenv
コマンドを実行するだけです。
brew upgrade --fetch-HEAD goenv
goenv をアンインストールする方法は、公式サイトの Uninstalling goenv に手順があります。brew uninstall goenv
コマンドを実行するだけです。
brew uninstall goenv
まとめ
私見を述べると、学習するだけならパッケージ、実務なら goenv かなと思います。
Homebrew から goenv をインストールする方法はちょっと微妙でした。理由は brew install --HEAD goenv
コマンドを実行しても最新の Go バージョンリストが取得できなかったからです。解決方法は調べればあると思いますが、初心者には優しくないかな〜と感じました。
以上です。
おわりに
開発環境の構築が終わったら、次は Go 公式サイトのチュートリアル「A Tour of Go」で Go の書き方を学ぶと良いでしょう。
- 日本語翻訳版 チュートリアル : https://go-tour-jp.appspot.com/
- 英語版 チュートリアル : https://tour.golang.org/