Go初学者が学んだことまとめ〜その４〜（コマンド、パッケージ）

#はじめに
こちらの続きです。
[Go初学者が学んだことまとめ〜その１〜（構成と実行、構文）](https://qiita.com/haru_iwamoto/items/87d9cf6ff5219b5c3a5a)
[Go初学者が学んだことまとめ〜その２〜（参照型）](https://qiita.com/haru_iwamoto/items/0c2d43b06f712311aa18)
[Go初学者が学んだことまとめ〜その３〜（構造体、インターフェース）](https://qiita.com/haru_iwamoto/items/cd36429b3c4fb1627fdf)

今回は、Goのコマンド、パッケージなどです。
特徴的なものをピックアップしてまとめています。

#goコマンド
##go fmt
標準フォーマットに整形するコマンド。
下記は再帰的に実行。

```
$ go fmt ./...
```
IDEなどではファイル保存時にgo fmtを実行するように設定しておけば、常にフォーマット通りのコードができる。
このコマンドが存在することで、コーディングルールにおける宗教論争を回避している。

##go doc
パッケージのドキュメントを参照するためのコマンド。

```
$ go doc math/rand
package rand // import "math/rand"

Package rand implements pseudo-random number generators.

Random numbers are generated by a Source. Top-level functions, such as
Float64 and Int, use a default shared Source that produces a deterministic
〜
```

パッケージ名の後ろをピリオドで区切って定数や関数のドキュメントも参照できる。

```
$ go doc math/rand.Seed
func Seed(seed int64)
    Seed uses the provided seed value to initialize the default Source to a
    deterministic state. If Seed is not called, the generator behaves as if
    seeded by Seed(1). Seed values that have the same remainder when divided by
    2^31-1 generate the same pseudo-random sequence. Seed, unlike the Rand.Seed
    method, is safe for concurrent use.
```

###ドキュメント作成
独自に作成したパッケージをgo docに対応させることができる。
ソースコード内に記述したコメントがそのままドキュメントとして利用されるため、非常に簡単。

```Go:$GOPATH/src/bar/bar.go
// barパッケージの説明
package bar

// TBar型の構造体
type TBar struct {
	Id int
}

// TBar型に定義されたメソッド
func (t * TBar) Method1() {
}

//コンストラクタ
func NewTBar() *TBar {
	return &TBar{}
}
```

```
$ go doc bar
package bar // import "bar"

barパッケージの説明

type TBar struct{ ... }
    func NewTBar() *TBar
```

```
$ go doc bar.TBar
type TBar struct {
        Id int
}
    TBar型の構造体


func NewTBar() *TBar
func (t *TBar) Method1()
```

```
$ go doc bar.TBar.Method1
func (t *TBar) Method1()
    TBar型に定義されたメソッド
```

##go get
外部パッケージのダウンロードとインストールをまとめて行うコマンド。
依存関係を抽出して、必要なパッケージのダウンロード、インストールを行ってくれる。

```
$ go get golang.org/x/net/http2
```
$GOPATH配下にインストールされる。
ちなみにuninstallコマンドは無いので、削除したい場合は手動で消すしかない。

##dep
Goのオフィシャルチームが開発した依存関係管理ツール。
JavaScriptのnpmやrubyのbundlerのようなもの。

go getは$GOPATH配下にインストールされるが、１つの開発環境で複数のプロジェクトを開発する場合は、同一のパッケージで複数のバージョンを持つことができないという問題が発生する。
そこで、プロジェクトごとにインストールするパッケージを管理するツールがこのdep。
また、どの環境でも同じバージョンのパッケージをインストールすることができる。複数人の開発の際に同一のバージョンで実行されることが保証されるため便利。

他の方が使い方をまとめているので、そちらを参考にしていただければ。
[依存関係管理ツールdep(golang)](https://qiita.com/Azizjan/items/66564b5dc7597717932b)

##その他
|コマンド|説明|
|-----|------|
|go version|バージョン情報|
|go env    |環境変数を確認|
|go build  |ビルド|
|go install| ビルドしてGOPATH内にインストール|
|go test| テストの実行|

#パッケージ

公式ドキュメントは[こちら](https://golang.org/pkg/)

主要なパッケージの簡単な概要と、特徴的なところだけまとめてみた。

|パッケージ|概要|
|-------|----------------------|
|os|OS依存の機能をラップしたもの。プロセス管理、コマンドライン引数、ファイル操作など。|
|time|日付、時間関連。スリープ機能(Sleep)、指定時間間隔ごとにチャネル受信(Tick)、指定時間後に一度だけチャネル受信(After)という機能もある。|
|math|数学関連|
|math/rand|乱数生成|
|flag|コマンドラインオプション|
|fmt|フォーマット処理を含めた入出力処理。出力先は、標準出力、文字列、io.Writer型。|
|log|ログ出力機能。かなりシンプル。ログレベルやローテート機能などがない。外部パッケージにもデフェクトスンタンダードとなるものがなさそう。|
|strconv|基本的なデータ型とstring型の相互変換|
|unicode|Unicodeコードポイント処理のユーティリティ|
|strings|文字列操作|
|io|入出力のための型とインターフェースがまとめられたもの|
|bufio|入出力処理にバッファ処理を付加した機能|
|io/ioutil|入出力処理サポート機能。簡易的なファイルの読み書き、tmpファイル作成など。|
|regexp|正規表現|
|json|JSONのエンコーダー、デコーダー機能|
|net/url|URLのパースや生成|
|net/http|HTTPクライアント、サーバ機能|
|sync|非同期処理で使用する排他制御、同期処理|
|crypto/*|MD5,SHA-1等のハッシュ値生成など|

#まとめ
Goにはgo fmtやgo docなど素敵なコマンドがあります。また、標準のパッケージが充実しています。
その一方で、パッケージの依存関係管理ツールが弱い、logのローテート機能がないなど、RubyやJavaScriptを使っている人間からすると、なんでその機能がないのと思ってしまうところもありました。何か理由があるのでしょうか？

Go初学者が学んだことまとめは以上になります。
スクリプト言語のような手軽さと、コンパイル言語の高速性を併せ持つこの言語を使いこなせれば、エンジニアとして大きな武器になるはず。これからも学び続けていき、実践で使っていきたいと思います。

#参考
[スターティングGo言語](https://www.amazon.co.jp/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%E8%A8%80%E8%AA%9E-%E6%9D%BE%E5%B0%BE%E6%84%9B%E8%B3%80-ebook/dp/B01FH3KRTI)

#関連
[Go初学者が学んだことまとめ〜その１〜（構成と実行、構文）](https://qiita.com/haru_iwamoto/items/87d9cf6ff5219b5c3a5a)
[Go初学者が学んだことまとめ〜その２〜（参照型）](https://qiita.com/haru_iwamoto/items/0c2d43b06f712311aa18)
[Go初学者が学んだことまとめ〜その３〜（構造体、インターフェース）](https://qiita.com/haru_iwamoto/items/cd36429b3c4fb1627fdf)