goの環境構築
ここではローカルコンピュータでの環境構築と使い方を紹介します。私のコンピュータがMacなのでMacでの実行環境に依存した説明になると思いますが、mac以外のコンピュータでのインストール方法を説明しているサイト紹介しています。
今回はコマンドラインを使った操作があるのでcd
, ls
, mkdir
, touch
といった基本的なコマンドを知っていることを前提に進めさせていただきます。
インストール
これまでTour of Goやplaygroundでしかコードを書いてこなかったのでローカルでの書き方やパッケージ管理の仕方をまとめます。
Goは複数の環境構築方法を用意しています。
- ソースコードのインストール
標準的なインストール方法です。Unix系システムをよく使うユーザ、特に開発者であれば、設定を好みに合わせて変更できます。 - 標準パッケージのインストール
Goは便利なインストールパッケージを用意しています。Windows, Linux, Macのシステムをサポートしています。とりあえずさっとインストールするにはうってつけでしょう。システムのbit数に対応したインストールパッケージをダウンロードして、"Next"をたどるだけでインストールできます。 - サードパーティツールによるインストール
現在便利なサードパーティパッケージも多くあります。たとえばUbuntuのapt-get、Macのhomebrewなどです。これらのシステムに慣れたユーザにはぴったりのインストール方法です。
初めてなら標準パッケージのインストールをオススメします。私はMacユーザーでMacでのインストールしかできません。仮想環境などで構築してみようとも思ったのですが、余裕がありませんでした。なのでインストールの方法は読者に任せたいと思います。とはいえ全部投げると書いている意味がないのでインストールの方法を書いているサイトを一つ紹介します。丁寧に書かれているので解りやすいと思います。
astaxie
インストール後、書いたコードやプロジェクトを管理するワーキングディレクトリの設定が必要です。ワーキングディレクトリは任意の場所に作っていいみたいですが、OSなどによってよく使われるディレクトリ構成があるみたいなので調べて参考にされると良いと思います。また、ワーキングディレクトリにはGOPATH
という環境変数でパスを通す必要があります。以降はワーキングディレクトリの作成とGOPATHの設定が終わったところから話を進めたいと思います。
また、私の実行環境に依存した説明になると思うので以下に書いておきます。
MacBook Pro (Early 2015)
macOS Catalina ver.10.15.6
go version go1.14.7 darwin/amd64
エディタはVScode
Goに関する環境変数の確認は以下のようなコマンドで確認できます。
go env GOPATH
ワーキングディレクトリ
ここではインストールして実際に作業するワーキングディレクトリにパスGOPATH
を通したあとの話をします。
Goのワーキングディレクトリは以下のような3つのディレクトリで構成するよう決められています。ディレクトリがない場合は自分で作りましょう。
~/go
$ ls
bin/ pkg/ src/
- src:自分が書いたプログラムファイルを置くところ。
- pkg: インストールしたり自分で作ったパッケージファイルを置くところ。
- bin:バイナリファイルがあるところ。プログラムをビルドした際の実行ファイルが出力されるところ。今後はプログラムを書いたディレクトリに直接実行ファイルを出力するので触らない。
binに実行ファイルを出力するには環境変数PATH
にパスを通しておく必要があります。
srcにプログラムを作る
まずは設定の確認等も含めてhello world
を表示するだけの簡単なプログラムを作ってみましょう。まず以下のようにディレクトリとプログラムを作成します。
$ mkdir hello
$ touch main.go
:~/go/src/hello
$ ls
main.go
main.goがコードを書くファイルになります。これをお好みのエディタで開いて以下のように編集していきます。
// code:env-1 hello/main.go
package main
import "fmt"
func main() {
fmt.Println("hello")
}
コードを書いたら、実行します。実行はgo run ファイル名
コマンドで行います。
:~/go/src/hello
$ go run main.go
hello
実行ファイルはgo build
コマンドで出力します。
:~/go/src/hello
$ go build
:~/go/src/hello
$ ls
hello* main.go
.goファイルのあるディレクトリでコマンドを実行した場合は、ファイル名を指定する必要はありません。実行ファイルの名前は.goファイルの名前ではなくディレクトリの名前になります。
実行は実行ファイルをそのまま実行してください。macだと以下のようになります。
:~/go/src/hello
$ ./hello
hello
これがローカルでの実行になります。もし上手くいかなかった場合はパスが通っていなかったり設定が異なる部分があると思うので確認をお願いします。
パッケージ
pkgは他の人が書いたプログラムを使いたい場合にそのプログラムをインストールする場所です。例えばnode.jsだと$ npm install **
, Pythonだとpip install **
をするのと同じです。パッケージの取得方法は以下の2種類あります。
- 自分の書いたプログラムをパッケージにする
- インターネット上からリモートパッケージを取得
自分の書いたプログラムをパッケージにする
自分が書いたプログラムをパッケージにする時はまず、そのプログラムを書く必要があります。今回は、A Tour of Goでもあった平方根を求めるプログラムを書いてパッケージにしてみましょう。
自分でプログラムを書く際は前述のようにsrcディレクトリにファイルを作ります。パッケージ名は"mymath"にしましょう。srcディレクトリにmymathディレクトリを作成します。ディレクトリ名がそのままパッケージ名になります。mymathディレクトリ内にsqrt.goを作成し、以下のように平方根を求める関数を書きます。
// code:env-2 mymath/sqrt.go
package mymath
// Sqrt 引数xを受け取りその平方根を返す。
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
Goでは変数や関数の頭文字を大文字にしたものはファイルの外部から呼び出すことが出来ます。頭文字が小文字で始まっているものはそのファイル内でのみ利用可能で外部からアクセスすることは出来ません。
次にパッケージにするためにmymathディレクトリでgo install
を実行します。すると以下のように/pkg/${GOOS}_${GOARCH}
内(私の場合だと/pkg/darwin_amd64
)にmymath.aが作成されます。
:~/go/src/mymath
$ go install
:~/go/src/mymath
$ cd ../../pkg/darwin_amd64/
:~/go/pkg/darwin_amd64
$ ls
github.com/ mymath.a
もしmymathディレクトリ以外で行う場合はgo install ディレクトリ名
でパッケージにすることも出来ます。
これで平方根を求めるプログラムをパッケージとして使用することが出来るようになりました。
このパッケージを使うために/srcに戻ってmathappディレクトリを作成します。その中にmain.goを作成します。
Goではmainとついているファイルが実行ファイルになります。それ以外の名前がついたファイルはmainから呼び出されるファイルになります。mainに以下を記述しましょう。
// code:dev-3 mathapp/main.go
package main
import (
"fmt"
"mymath" // *
)
func main() {
fmt.Println("hello go.")
fmt.Printf("Sqrt(2) = %v\n", mymath.Sqrt(2))
fmt.Println("done.")
}
先ほど作った平方根を求めるmymathはimportで呼び出すことが出来ます。実行してみましょう。
:~/go/src/mathapp
$ go run main.go
hello go.
Sqrt(2) = 1.414213562373095
done.
このようにして自分の作ったファイルはパッケージにします。
インターネット上からリモートパッケージを取得
インターネット上には優秀なパッケージがたくさんあります。それを使って開発を楽にするのは良いことです。そのようなインタネット上にあるリモートパッケージはgithub、googlecode、bitbucket、Launchpadなどから取得することが出来ます。
リモートパッケージを取得する際は、
go get githubのリポジトリ名(githubの場合)
の形で取得出来ます。
例えばgithubから取得する場合は、
go get github.com/astaxie/beedb
とリポジトリを指定して取得します。
go get
の挙動は、まず/src/github.com/
にクローンが作ります。その後クローンを元にgo install
が実行され/pkg/darwin_amd64/github.com/
にパッケージが作られます。
Discussion