純規の暇人趣味ブログ

首を突っ込んで足を洗う

Go言語をWindowsに(zipで)インストールする

      HimaJyun

Go、ちょっと興味あってググってみたらクロスコンパイルが簡単だというではありませんか。これはツール制作に便利だぞ!と。

しかもfcgi用のモジュールもあるのでその気になればWebにも使える!(まぁHTTPでリバースプロキシしても良いけど)

やる/出来るかどうかは別として、とりあえず環境構築してみる事に

Go環境構築

環境は以下の通り。

  • Windows10 Pro(x64)、きょうびWin10未満とか32bitとか論外ですよねっ!
  • Go 1.9.2(zip版)

ダウンロードを見てみたらzip版があったのでそちらを選択。(インストーラーを使うのが楽なんだけど、構造を理解しておきたいのでzipを選択)

あ、あと、「環境変数を設定する」がチラホラ出て来るので先に説明しておく。

Windows10ならタスクバーの検索窓に「env」って入れたら出る(ちなみにcalcで電卓が出る、便利なので覚えておこう)

配置&GOROOTの設定

インストーラーを使う場合は不要。

ダウンロードしたzipを任意の場所に展開する、でもって、環境変数にGOROOTを設定する。(値は展開したパス、例えばE:\Goに展開したならそれを)

PathにGOROOT/binを追加する(例えばE:\Go\bin)

要はGOROOTを展開したディレクトリに設定し、GOROOT/binをPathに通すわけだ。

GOPATH

「設定しましょう」と書かれてある記事が多いけど、設定しなくても出来そう?

(公式ページでも「場所を変えたい場合はGOPATHを設定してね」とは書かれてあるが「GOPATHを設定しないと動かないよ」とは書かれていない)

GOPATHはgo getしたパッケージなどが入る場所、デフォルトでは$HOME/go(Windows的に言うなら%USERPROFILE%\go)

Java(Maven)でいう~/.m2にワーキングディレクトリが付いたような物。

まぁ、設定しなくて良いらしいのでしない。

GOBIN

デフォルトだと空で、GOPATH/binが使われる。

ここはGoでbuildやgetしたツール(バイナリ)が入る場所らしく、Pathに設定しておけば手に入れたコマンドをそのままプロンプトから実行できる。

仮に設定するとしてもGOBINを設定するのではなくGOPATH/binをPathに追加するので良いと思う。

環境変数

分かりづらいのでここまでに出てきたgoの環境変数を解説(ちなみに環境変数はgo envで確認できる)

  • GOROOT: Goをインストールした場所
  • GOPATH: ワーキングディレクトリ、未設定なら$HOME/go
  • GOBIN: Goのバイナリが入る場所、未設定ならGOPATH/bin
  • Pathに追加: 最低でもGOROOT/binを追加する必要がある、任意でGOBINも

こんな感じ。

自分の場合$HOME/bin(%USERPROFILE%\bin)をPathに追加しており、ここにwhoisとか開発用Web鯖とかを入れているので、GOBIN->$HOME/binにシンボリックリンクでも張ったので良いかと思っている。

動作確認

色々書いてみたけど、つまるところは環境変数を設定するだけ(しかもインストーラー版ならそれも自動なので、インストーラーでインストールして終わり)

せっかくなのでインストール出来ているか確認しておく。

go (version|get)

go versionしてみてバージョンが出ればOK。

今回の環境では「go version go1.9.2 windows/amd64」と出た

go getもしてみる。

「go get github.com/golang/lint/golint」とかやってみて、GOPATHにファイルが出来てたら良い

ハロワ

ハロワする。

package main

import "fmt"

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

実行するのはこうやるみたい

go run ./hello.go

ハロワが表示されればOK

ビルドもやってみる

ビルド!

go build ./hello.go

これで実行ファイルが出来る。Goのメリットは出来上がったバイナリに必要な物が静的リンクされるので実行にランタイムとかが要らない事だよね。

(逆にJavaのJREみたいなスタイルのメリットはランタイムが必要な代わりにユーザー側がランタイムをアップデートするだけでプログラム改修なしに性能アップの可能性がある事)

デフォルトだと使っているPCにベストマッチするバイナリが作られるが、設定すればクロスコンパイルも可能。

GOOS=linux GOARCH=amd64 go build hello.go

(同じ事(変数にセットしながらコマンド実行)をPowerShellでどうやってやるのか分からなかったのでMINGWで実行した、どうやってやるの?)

こんな風にすれば様々な環境向けのバイナリをゲロゲロと吐ける、数が多いのでスクリプトで自動化すべきだとは思うけど。

(Go製ツールはARM(RasPi)用バイナリも用意されてて丁寧だなぁ、と思っていたが、クロスコンパイルが簡単だからなせる業だね!)

インストーラー版を使おう

「zipでインストールする」とか銘打った記事でこの結論に達するのもちゃんちゃらおかしいのですけどね……

個人的にWindowsならインストーラー版の方が良いかなと、Goはアップデート時に前バージョンの削除が必要ですが、インストーラー版ならその辺りも面倒見てくれる。

インストーラーはデフォルトだとC:\Goに入れようとして来るけど、「Program Files(空白が含まれるフォルダ名)」でも特に問題はなさそう。

仮にGoをアンインストールする事になったとしても、zipでインストールしてると実行ファイルだけ消して環境変数を消し忘れる可能性が無きにしも非ずなので。

その他様々な理由からインストーラーに世話してもらった方が良いんじゃないかな?

環境変数使いたくない

環境変数でGOPATHやGOBINが設定出来るようになっているが、個人的には環境変数はあまり使いたくない。

手で設定した(インストーラーに管理されない)環境変数を増やしたくない。理由としては環境変数を(消し|変更し)忘れる可能性があるため。

GOPATHであれば、環境変数で変更するのではなく、$HOME/goをシンボリックリンクにした方が良い。

シンボリックリンクならリンクが切れている場合にエラーが出るが、環境変数だと宛先がなくなっていても分からないので。

(この辺りは「依存関係管理ツールのディレクトリ変更がダルすぎる話」を参照)

私はめんどくさい奴なので、クソみたいな拘りだ。環境変数を使うかどうかは自分の考え方に合わせて選べば良いと思う。

何はともあれ、Goという言語はなかなか面白そう。(あえて気に入らない点を言うとすれば、マスコットがキモい)

 - コンピューター