🐭

goの環境構築

2020/10/03に公開

ここではローカルコンピュータでの環境構築と使い方を紹介します。私のコンピュータが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