# 1.3 Goのコマンド

## Goのコマンド

  Go言語は完全なコマンド操作ツールセットを持つ言語です。コマンドラインで`go`を実行することでそれらを確認することができます：

  ![](images/1.3.go.png?raw=true)

図1.3 Goコマンドで詳細情報を表示

  これらのコマンドは我々が普段コードを書いている時に非常に役立つものです。次に普段使用するコマンドを理解していきましょう。

## go build

  このコマンドは主にコンパイルテストに用いられます。パッケージのコンパイル作業中、もし必要であれば、同時に関連パッケージもコンパイルすることができます。

  - もし普通のパッケージであれば、我々が1.2章で書いた`mypath`パッケージのように、`go build`を実行したあと、何のファイルも生成しません。もし`$GOPATH/pkg`の下に対応するファイルを生成する必要があれば、`go install`を実行してください。

  - もしそれが`main`パッケージであれば、`go build`を実行したあと、カレントディレクトリの下に実行可能ファイルが生成されます。もし`$GOPATH/bin`の下に対応するファイルを生成する必要があれば、`go install`を実行するか、`go build- o パス/a.exe`を実行してください。

  - もしあるプロジェクトディレクトリに複数のファイルがある場合で、単一のファイルのみコンパイルしたい場合は、`go build`を実行する際にファイル名を追加することができます。例えば`go build a.go`です。`go build`コマンドはデフォルトでカレントディレクトリにある全てのgoファイルをコンパイルしようと試みます。

  - コンパイル後に出力されるファイル名を指定することもできます。1.2章の`mathapp`アプリケーションでは`go build -o astaxie.exe`と指定できます。デフォルトはpackage名（mainパッケージではない）になるか、ソースファイルのファイル名（mainパッケージ）になります。

  （注：実際はpackage名は[Go言語の規格](https://golang.org/ref/spec)においてコード中の"package"に続く名前になります。この名前はファイル名と異なっていても構いません。デフォルトで生成される実行可能ファイル名はディレクトリ名。

  - go buildはディレクトリ内の"\_"または"."ではじまるgoファイルを無視します。

  - もしあなたのソースコードが異なるオペレーティングシステムに対応する場合は異なる処理が必要となります。ですので異なるオペレーティングシステムの名称にもとづいてファイルを命名することができます。例えば配列を読み込むプログラムがあったとして、異なるオペレーティングシステムに対して以下のようなソースファイルがあるかもしれません。

	array_linux.go
	array_darwin.go
	array_windows.go
	array_freebsd.go

  `go build`の際、システム名の末尾のファイルから選択的にコンパイルすることができます（Linux、Darwin、Windows、Freebsd）

## go clean

  このコマンドは現在のソースコードパッケージのなかでコンパイラが生成したファイルを取り除く操作を行います。これらのファイルはすなわち：

	_obj/            旧objectディレクトリ、MakeFilesが作成する。
	_test/           旧testディレクトリ，Makefilesが作成する。
	_testmain.go     旧gotestファイル，Makefilesが作成する。
	test.out         旧testログ，Makefilesが作成する。
	build.out        旧testログ，Makefilesが作成する。
	*.[568ao]        objectファイル，Makefilesが作成する。

	DIR(.exe)        go buildが作成する。
	DIR.test(.exe)   go test -cが作成する。
	MAINFILE(.exe)   go build MAINFILE.goが作成する。

  私は基本的にこのコマンドを使ってコンパイルファイルを掃除します。ローカルでテストを行う場合これらのコンパイルファイルはシステムと関係があるだけで、コードの管理には必要ありません。

## go fmt

  読者にC/C++の経験があればご存知かもしれませんが、コードにK&Rスタイルを選択するかANSIスタイルを選択するかは常に論争となっていました。goでは、コードに標準のスタイルがあります。すでに培われた習慣やその他が原因となって我々は常にANSIスタイルまたはその他のより自分にあったスタイルでコードを書いて来ました。これは他の人がコードを閲覧する際に不必要な負担を与えます。そのためgoはコードのスタイルを強制し（例えば左大括弧はかならず行末に置く）、このスタイルに従わなければコンパイルが通りません。整形の時間の節約するため、goツールは`go fmt`コマンドを提供しています。これはあなたの書いたコードを整形するのに役立ちます。あなたの書いたコードは標準のスタイルに修正されますが、我々は普段このコマンドを使いません。なぜなら開発ツールには一般的に保存時に自動的に整形を行ってくれるからです。この機能は実際には低レイヤでは`go fmt`を呼んでいます。この次の章で２つのツールをご紹介しましょう。この２つのツールはどれもファイルを保存する際に`go fmt`機能を自動化させます。

>go fmtコマンドの使用では、多くの場合はgofmtを使用しますが、-wオプションが必要になります。さもなければ、整形結果はファイルに書き込まれません。gofmt -w src、ですべての項目を整形することができます。

## go get

  このコマンドは動的にリモートコードパッケージを取得するために用いられます。現在BitBucket、GitHub、Google CodeとLaunchpadをサポートしています。このコマンドは内部で実際には2ステップの操作に分かれます：第1ステップはソースコードパッケージのダウンロード、第2ステップは`go install`の実行です。ソースコードパッケージのダウンロードを行うgoツールは異なるドメインにしたがって自動的に異なるコードツールを用います。対応関係は以下の通りです：

	BitBucket (Mercurial Git)
	GitHub (Git)
	Google Code Project Hosting (Git, Mercurial, Subversion)
	Launchpad (Bazaar)

  そのため、`go get`を正常に動作させるためには、あらかじめ適切なソースコード管理ツールがインストールされていると同時にこれらのコマンドがあなたのPATHに入っていなければなりません。実は`go get`はカスタムドメインの機能をサポートしています。具体的な内容は`go help remote`を参照ください。

## go install

  このコマンドは実際には内部で2ステップの操作に分かれます。第1ステップはリザルトファイルの生成（実行可能ファイルまたはaパッケージ）、第2ステップはコンパイルし終わった結果を`$GOPATH/pkg`または`$GOPATH/bin`に移動する操作です。

## go test

  このコマンドを実行すると、ソースコードディレクトリ以下の`*_test.go`ファイルが自動的にロードされ、テスト用の実行可能ファイルが生成/実行されます。出力される情報は以下のようなものになります

	ok   archive/tar   0.011s
	FAIL archive/zip   0.022s
	ok   compress/gzip 0.033s
	...

  デフォルトの状態で、オプションを追加する必要はありません。自動的にあなたのソースコードパッケージ以下のすべてのtestファイルがテストされます。もちろんオプションを追加しても構いません。詳細は`go help testflag`を確認してください。

## go doc

  (1.2rc1 から go doc コマンドはなくなり、 godoc コマンドのみになります)
  多くの人がgoはいかなるサードパーティドキュメントも必要としないと言っています。なぜなら例えばchmマニュアルのように（もっとも私はすでに[chmマニュアル](https://github.com/astaxie/godoc)を作っていますが）、この中にすでに非常に協力なドキュメントツールが入っているからです。

  どのように対応するpackageのドキュメントを確認すればよいでしょうか？
  例えばbuiltinパッケージであれば、`go doc builtin`と実行します。
  もしhttpパッケージであれば、`go doc net/http`と実行してください。
  パッケージの中の関数を確認する場合は`godoc fmt Printf`としてください。
  対応するコードを確認する場合は、`godoc -src fmt Printf`とします。

  コマンドラインでコマンドを実行します。 godoc -http=:ポート番号 例えば`godoc -http=:8080`として、ブラウザで`127.0.0.1:8080`を開くと、golang.orgのローカルのcopy版を見ることができます。これを通してpkgドキュメントなどの他の内容を確認することができます。もしあなたがGOPATHを設定されていれば、pkgカテゴリの中で、標準パッケージのドキュメントのみならず、ローカルの`GOPATH`のすべての項目に関連するドキュメントをリストアップすることができます。これはグレートファイアーウォールの中にいるユーザにとっては非常にありがたい選択です。

## その他のコマンド

  goは他にも様々なツールを提供しています。例えば以下のツール

        go fix は以前の古いバージョンのコードを新しいバージョンに復元するために使われます。例えばgo1の前の古いバージョンのコードをgo1に移動させます。
        go version はgoの現在のバージョンを確認します。
        go env は現在のgoの環境変数を確認します。
        go list は現在インストールされている全てのpackageをリストアップします。
        go run はGoプログラムのコンパイルと実行を行います。

以上これらのツールはまだ多くのオプションがあり、ひとつひとつはご紹介しませんが、ユーザは`go help コマンド`で更に詳しいヘルプ情報を取得することができます。


## links
   * [目次](<preface.md>)
   * 前へ: [GOPATHとワーキングディレクトリ](<01.2.md>)
   * 次へ: [Goの開発ツール](<01.4.md>)
