25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goを書く前に知っておくべき3つのこと

Last updated at Posted at 2019-11-27

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.v2github.com/go-yaml/yaml というレポジトリのバージョンタグで v2, v2.x, または v2.x.x とついている中で最新のものを拾ってくる)と実は色々あります。

Go のディレクトリ構造やコード整理などについてより詳しいことは公式ドキュメントにまとまっているので一読することをおすすめします。

2. プロジェクトの構造

次に重要なのは個別のプロジェクトの構造です。Goのソースコードはプロジェクトディレクトリの直下に置いてくださいsrc などのディレクトリを切ることは非推奨です)。なぜかというとプロジェクトディレクトリ以下にディレクトリを切るとそれらのディレクトリはサブパッケージ扱いになるからです(github.com/<username>/<package>/srcsrc というパッケージになってしまう)。大量のファイルができてしまうことが憂慮される場合は適切にディレクトリを切ってサブパッケージ化したりプロジェクトを分けたりとコードの境界を意識して開発をする必要があります。

次にバイナリを配布したい場合はプロジェクトそのものを 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

Happy Hacking!

25
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?