【Go言語入門】Goで開発するなら知っておきたい5つのコマンド

## 概要

この記事では、Goで開発する上で役立つ5つのコマンドについて紹介します。
以下が紹介するツールの一覧です。

1. `gofmt`
2. `go vet`
3. `go build`
4. `go mod`
5. `go doc`

それぞれ簡単な説明と使用法を紹介します。
これらのツールを使いこなすことで、より効率的に開発を進めましょう！

## 1. gofmt （コードの整形）

[gofmt](https://pkg.go.dev/cmd/gofmt)は、コードを自動的に整形してくれるツールです。
コードを自動整形することにより、可読性が向上し、書き方を統一することができます。

### gofmtの使い方

実際に試してみましょう。
以下はフォーマットがかかっていないコードです。

```hello.go
package main
import "fmt"
func main()
{
fmt.Println("hello,world")
}
```

それに対し、`gofmt`コマンドを実行します。

```shell
gofmt -w hello.go
```

すると、以下のように自動整形されます。
```hello.go
package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}
```

`gofmt`により自動整形されたコードは、可読性が向上していることがわかります。
注意点としては、`-w` オプションをつけることでファイルを上書きしてしまうため、必要であれば編集前のコードのバックアップをとっておきましょう。

## 2. go vet (コードの静的解析）

[go vet](https://pkg.go.dev/cmd/vet)は、Goのソースコードに対して静的解析を行い、コードの問題点を検出するツールです。
例えば、宣言された変数が未使用である場合や、ポインタの間違いなどを検出します。
これにより、コンパイラによってキャッチされないエラーを見つけることができます。

### go vetの使い方

例えば、以下のようなコードがあったとします。
```main.go
package main

import "fmt"

func main() {
	var i int
	fmt.Println("hello, world")
}
```
このコードを`go vet`でチェックすると、変数iが宣言されているが初期化されていないという警告が表示されます。

```shell
$ go vet main.go
# command-line-arguments
vet: ./main.go:6:6: i declared and not used
```

注意点としては、`go vet`は、コードの問題点を検出して警告を表示するだけで自動修正機能はありません。
そのため、警告が表示された場合は、コードを修正する必要があります。

また`go vet`は静的解析を行うため、実行時に発生する問題やランタイムエラーは検出することができません。
`go vet`だけでなくテストコードの作成や実行を行うことも必要となります。

## 3. go build （コードのビルド）

[go build](https://pkg.go.dev/go/build)は、コードをビルドし、実行可能なバイナリファイルを生成するツールです。
`go build`を使うことで、実行ファイルを手軽に作成できます。

### go buildの使い方

まず、以下のようなサンプルコードを用意します。

```main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}
```

`go build`コマンドを実行することで、コードをコンパイルし、実行ファイルを生成します。
```shell
go build main.go
```
この場合は、実行ファイル main が生成されます。
そして、以下のように実行します。

```shell
./main
Hello, world!
```

また`-x` フラグを付けて実行することで、どのようにビルドが行われているかを確認することができます。
ビルドの手順が気になる方は是非試してみてください。

## 4. go mod (依存関係の管理)

Go 1.11 から導入されたモジュールシステムにより、依存関係を管理する [go mod](https://go.dev/ref/mod) コマンドが提供されています。 
`go mod` コマンドを使用することで、必要なパッケージやライブラリを簡単にインストールすることができます。
これにより、依存関係が自動的に解決され、プログラムのビルドに必要なパッケージがまとめてダウンロードされます。

## go modの使い方

### 1. モジュールの初期化

まず、プロジェクトをモジュールとして初期化する必要があります。
これは、以下のコマンドで行うことができます。

```shell
go mod init <module-path>
```
これにより、プロジェクトのルートディレクトリに go.mod ファイルが生成され、モジュール名が指定されます。

### 2. パッケージの追加

次に、必要なパッケージやライブラリを `go get` コマンドを使用して追加します。

```shell
go get <package-name>
```
このコマンドを実行すると、必要なパッケージが自動的にダウンロードされ、go.mod ファイルに追記されます。

### 3. パッケージのアップグレード
`go get -u` コマンドを使用することで、モジュールの依存関係を解決し、パッケージをアップグレードすることができます。

```shell
go get -u <package-name>
```
このコマンドを実行すると、指定されたパッケージが最新のバージョンにアップグレードされます。

### 4. 依存関係の解決
go.mod ファイルには、必要なパッケージの依存関係が記録されています。
依存関係を解決するには、以下のコマンドを使用します。

```shell
go mod tidy
```
このコマンドを実行することで、go.mod ファイルに記録されている依存関係が解決され、不要なパッケージが削除されます。

プロジェクトを go mod で管理する場合は、$GOPATH/bin にインストールされたパッケージが使用されるのではなく、go.mod ファイルで指定されたバージョンのパッケージが使用されるようになるため、意図しないバージョンが使用されることがなくなります。


## 5. go doc （ドキュメントの生成）

[go doc](https://tip.golang.org/doc/comment)は、Goのドキュメントを生成するツールです。
Goのパッケージには、コメントを書くことでドキュメントを埋め込むことができます。
このドキュメントには、パッケージの使用方法を始め、関数やメソッドの引数、戻り値、変数などの情報が含まれます。

### go docの使い方

`go doc`は、コマンドラインから使用することができます。以下は、fmt パッケージの Println 関数のドキュメントを表示する例です。

```shell
go doc fmt.Println
```

出力結果は以下のようになります。

```shell
package fmt // import "fmt"

func Println(a ...any) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline
    is appended. It returns the number of bytes written and any write error
    encountered.
```

また、パッケージ名だけを指定することで、そのパッケージに含まれる関数や変数などの一覧を表示することも可能です。

```shell
go doc fmt
```

出力結果は以下のようになります。

```shell
> go doc fmt           
package fmt // import "fmt"

Package fmt implements formatted I/O with functions analogous to C's printf and
scanf. The format 'verbs' are derived from C's but are simpler.
...
```

自作パッケージにもフォーマットに沿ったコメントを書くことで`go doc`を実行することができます。
```main.go
// "Hello, world!"と出力します。
package main

import "fmt"

func main() {
	fmt.Println("Hello, world!")
}
```
自作パッケージに対して `go doc`を実行します。
```shell
go doc main.go
"Hello, world!"と出力します。
```

注意点としては、`go doc`で表示されるドキュメントは、パッケージ内にコメントが含まれている場合にのみ生成されます。
コメントがない場合、`go doc`で表示される情報は限られます。

## まとめ

この記事では、Goの開発生産性を向上させるための5つのツールについて紹介しました。

1. gofmt：コードの整形
2. go vet：静的解析による不具合検出
3. go build：コードのビルドと実行ファイルの生成
4. go mod：依存関係の管理
5. go doc：ドキュメントの生成

これらのコマンドをうまく活用することで、コードの品質を向上させ、開発の生産性を高めることができます。
より便利に開発を進めるために、Goの便利なツールを駆使していきましょう！


## 参考

https://medium.com/mindorks/5-helpful-utilities-present-in-go-toolchain-bc4ad5ed4e78

https://qiita.com/uchiko/items/64fb3020dd64cf211d4e

https://qiita.com/marnie_ms4/items/b343165efb4235906db7