Goを書く前に知っておくべき3つのこと
言語について学習する以外で知っておくとあとあと人生が楽になることがいくつかあるので個人的に必須だと思っていること3つをサクっとリストアップしてみました。
1. 環境の準備
Goの面倒な要素として $GOPATH
という変数(未設定の場合は $HOME/go
)が指すディレクトリの下に全てのGoのソースコードが(少なくともエクスポートしたいものに関しては)入っている必要があります。変なこと(たとえばiCloudやDropBoxでコードをクラウドで同期するみたいなこと)をしない場合は未設定あるいは GOPATH=$HOME/go
と明示的に設定してしまっていいと思います。合わせて PATH=$PATH:$GOPATH/bin
も設定してしまいましょう。
$GOPATH
以下の階層は大雑把に以下のように構造化されています。
-
$GOPATH/
-
bin/
go get などでインストールされたバイナリ郡 -
pkg/
標準ライブラリ -
src/
その他のGoコード
-
ここでポイントになるのは src
以下の構造です。本来であれば src/myprojects
などとディレクトリを切りたいところですが、そうもいきません。というのも src
以下にはまずドメイン名が来るからです。「なんでや」と思われるかもしれませんがこの切り分けをすることでそのソースコードがどこから来ているかがわかりやすくなるというメリットがあります。
Goをインストールしたての場合は src
以下には何もないかと思います。そこで試しに以下のコマンドを実行してみてください。
$ go get github.com/ktnyt/assert
すると、$GOPATH/src/github.com/ktnyt/assert
というディレクトリが生成されます。同様に go get doma.in/path...
というコマンドを実行すると $GOPATH/src/doma.in/path...
というディレクトリができます。なので、自分のコードは原則的に $GOPATH/src/github.com/<GitHub user name>
というディレクトリ以下に作りましょう。
「現実的に github.com 以外のドメインからコード拾ってくることはあるの?」と思われるかもしれませんが実は結構あります。まず Go 公式のツールは大体 golang.org/x/tools/cmd/<toolname>
にあります。あとはGitHubのレポジトリから勝手にバージョンタグを拾って適切にインストールしてくれる gopkg.in
というサービスがあったり(例: gopkg.in/go-yaml/yaml.v2
は github.com/go-yaml/yaml
というレポジトリのバージョンタグで v2
, v2.x
, または v2.x.x
とついている中で最新のものを拾ってくる)と実は色々あります。
Go のディレクトリ構造やコード整理などについてより詳しいことは公式ドキュメントにまとまっているので一読することをおすすめします。
2. プロジェクトの構造
次に重要なのは個別のプロジェクトの構造です。Goのソースコードはプロジェクトディレクトリの直下に置いてください( src
などのディレクトリを切ることは非推奨です)。なぜかというとプロジェクトディレクトリ以下にディレクトリを切るとそれらのディレクトリはサブパッケージ扱いになるからです(github.com/<username>/<package>/src
は src
というパッケージになってしまう)。大量のファイルができてしまうことが憂慮される場合は適切にディレクトリを切ってサブパッケージ化したりプロジェクトを分けたりとコードの境界を意識して開発をする必要があります。
次にバイナリを配布したい場合はプロジェクトそのものを main
パッケージにしてしまうことは基本的に避けましょう。cmd/<commandname>
というディレクトリを切って go get github.com/<usermame>/<package>/cmd/<commandname>
とさせましょう。もちろん cmd/<command1>
cmd/<command2>
のように複数のコマンドを作ることも可能です。
他にも慣例的にいくつかのディレクトリを切ることがあります。例としてパッケージ内に参照範囲を限定する internal
やバージョンをフリーズしてコードを配布するための vendor
などがあります。Go プロジェクトの標準レイアウトは https://github.com/golang-standards/project-layout にテンプレートがあるので一度ご覧になることをおすすめします。
3. goimports
Goを書くときにストレスになりがちなことのひとつにインポート管理があります。未インポートのAPIを参照すると当然コンパイルエラーになりますが未使用のパッケージがインポートされているのもまたコンパイルエラーになります。Goと同梱のフォーマッタである gofmt は便利ですが実は goimports というインポートを自動的に挿入・削除してくれる上位互換があります。
$ go get golang.org/x/tools/cmd/goimports
このコマンドを実行すれば $GOPATH/bin
にバイナリがインストールされます。あとはお好みのエディタのフォーマッタコマンドに goimports を指定すればよしなにインポートを解決してくれるのでとても便利です。
まとめ
TL;DR
mkdir -p $GOPATH/github.com/<GitHub Username>
- https://golang.org/doc/code.html
- https://github.com/golang-standards/project-layout
$ go get golang.org/x/tools/cmd/goimports
Happy Hacking!