このエントリでは、「どんな用途に、どのツールを使っているか」 にフォーカスして、私の Go 開発環境まわりを用途別にざっと紹介します。
リポジトリ: https://github.com/naka-sei/tsudzuri
- 言語・ランタイム
- ローカル開発(ホットリロード / Docker / Make)
- DB / ORM
- Observability(ログ・トレース)
- API 定義 / コード生成
- フォーマット / Lint
- DI / テスト補助
- CI(GitHub Actions)
- VS Code の拡張と設定例
- MCP / Serena
言語・ランタイム
Go
-
Go
- 用途: バックエンド API の実装全般
- 特徴: 単一バイナリでデプロイしやすく、標準ライブラリだけでも Web/API 開発に必要な機能が揃っている。
- 公式: https://go.dev/
ローカル開発・ホットリロード
air
-
air
- 用途: Go アプリのホットリロード(
make devで利用) - 特徴: ファイル変更を監視して自動ビルド・再起動してくれるので、API を触りながら素早く動作確認ができる。
- 公式: https://github.com/air-verse/air
- 用途: Go アプリのホットリロード(
Docker / Docker Compose
-
Docker
- 用途: アプリ本体のコンテナイメージをビルドし、ローカルでもコンテナで実行
- 特徴: 本番用イメージをそのままローカルでも使えるので、「本番だけ動かない」を減らしやすい。
- 公式: https://www.docker.com/
-
Docker Compose
- 用途: API / DB / Swagger UI / テスト用 DB など複数コンテナの起動
- 特徴:
docker-compose.yaml一つで「API + Postgres + Swagger UI」をワンコマンドで立ち上げられる。 - 公式: https://docs.docker.com/compose/
Make
-
GNU Make
- 用途: ローカル開発タスクのラッパー(
make dev,make up,make test,make lint,make generateなど) - 特徴: 複雑なコマンド列を
Makefileに隠しておき、開発者は短いコマンドだけ覚えれば良いようにする。 - 公式: https://www.gnu.org/software/make/
- 用途: ローカル開発タスクのラッパー(
DB・ORM・マイグレーション
PostgreSQL
-
PostgreSQL
- 用途: 永続化層のメイン RDB(本番・ローカル・テスト)
- 特徴: OSS でメジャー。JSONB や拡張機能も多く、小さなサービスから大規模まで対応しやすい。
- 公式: https://www.postgresql.org/
ローカルでは Docker Compose で Postgres コンテナを立ち上げ、テスト用には testdb サービスを用意しています。make test でテスト用 DB が自動起動し、pg_isready で起動待ち合わせしてから go test ./... を実行する構成です。
ent
-
ent
- 用途: ORM / スキーマ定義(
infrastructure/db/ent以下) - 特徴: Go のコードでスキーマを書き、型安全なクエリやマイグレーションコードを生成できる。クエリも Go のコードとして完結するので、補完が効きやすい。
- 公式: https://entgo.io/
- 用途: ORM / スキーマ定義(
スキーマ定義は ent に寄せつつ、ドメイン層ではリポジトリインタフェースだけを見るようにして、ORM への依存を infrastructure に閉じ込めています。
Observability(ログ・トレース)
OpenTelemetry
-
OpenTelemetry (otel)
- 用途: 分散トレーシング・メトリクスの収集(
cmd/api/otel.go,pkg/trace/など) - 特徴: ベンダーロックインを避けつつトレース・メトリクスを集約できる標準的な仕組み。gRPC / HTTP 用のミドルウェアも揃っていて組み込みやすい。
- 公式: https://opentelemetry.io/
- 用途: 分散トレーシング・メトリクスの収集(
zap / zapdriver
-
zap
- 用途: 構造化ログの出力(
pkg/log/) - 特徴: 高速な構造化ロガー。JSON 形式でログを出して、後段のログ基盤で扱いやすくする。
- 公式: https://github.com/uber-go/zap
- 用途: 構造化ログの出力(
-
zapdriver
- 用途: GCP 系のログスタックと相性の良いフィールド(severity / trace など)を簡単に付与
- 特徴: ログとトレースを紐づけるためのフィールドをきれいに整えてくれる。
- 公式: https://github.com/blendle/zapdriver
API 定義・コード生成
Protocol Buffers / gRPC / gRPC-Gateway
-
Protocol Buffers (protobuf)
- 用途: API のスキーマ定義(
api/protobuf/) - 特徴: 1 つのスキーマから gRPC / REST / OpenAPI など複数のインターフェースを生成できる。
- 公式: https://protobuf.dev/
- 用途: API のスキーマ定義(
-
gRPC
- 用途: バックエンドの RPC プロトコル
- 特徴: HTTP/2 ベースで高速・型安全な通信を行える。サービス間通信にもそのまま流用しやすい。
- 公式: https://grpc.io/
-
gRPC-Gateway
- 用途: gRPC サービスから HTTP/JSON エンドポイントを自動生成
- 特徴: 同じ proto から gRPC と REST を両対応させるためのブリッジとして使える。
- 公式: https://github.com/grpc-ecosystem/grpc-gateway
buf
-
buf
- 用途: protobuf の管理・コード生成(
api/protobuf/buf.yaml,buf.gen.yaml) - 特徴: 依存管理 / Lint / 生成をまとめて扱える Proto 用ツールチェーン。
buf generateひとつで gRPC / gRPC-Gateway / OpenAPI などを生成可能。 - 公式: https://buf.build/
- 用途: protobuf の管理・コード生成(
私の場合は make generate/protobuf/go から buf を呼び出し、proto の更新からコード生成までをまとめて回しています。
フォーマット・Lint・依存管理
gofumpt
-
gofumpt
- 用途: Go コードの整形(
make fmt) - 特徴:
gofmtをベースにした、より厳しめのフォーマッタ。プロジェクト全体で一貫したスタイルを維持しやすくなる。 - 公式: https://github.com/mvdan/gofumpt
- 用途: Go コードの整形(
golangci-lint
-
golangci-lint
- 用途: 静的解析・スタイルチェック(
make lintや CI で実行) - 特徴: たくさんの Linters をまとめて走らせられる。CI での「最低限の品質ライン」を定義しやすい。
- 公式: https://golangci-lint.run/
- 用途: 静的解析・スタイルチェック(
go modules / vendoring
-
go modules /
go mod/ vendoring- 用途: 依存関係管理(
go.mod,go.sum,vendor/) - 特徴: Go 標準の依存管理。
go mod tidyや vendoring で再現性のあるビルドを目指す。 - 公式: https://go.dev/ref/mod
- 用途: 依存関係管理(
make deps で go mod tidy / go mod verify / go mod vendor をまとめて実行し、依存関係の整合性を保つようにしています。
DI・テスト補助
wire
-
wire
- 用途: 依存性注入のコード生成(
cmd/api/wire.go) - 特徴: コンパイル時 DI。Go のコードとして依存グラフを生成するので、ランタイムのリフレクションを避けつつ DI を活用できる。
- 公式: https://github.com/google/wire
- 用途: 依存性注入のコード生成(
go-cmp / mock
-
go-cmp
- 用途: テストでの構造体比較・差分表示
- 特徴: 「どこが違うか」を見やすく表示してくれるので、テスト失敗時の原因特定がしやすい。
- 公式: https://github.com/google/go-cmp
-
go.uber.org/mock
- 用途: モック生成・テストダブル
- 特徴: インターフェースからモックを自動生成し、ユースケースやドメインのテストを組みやすくする。
- 公式: https://github.com/uber-go/mock
CI(GitHub Actions)
GitHub Actions
-
GitHub Actions
- 用途: Lint / Test を自動で実行する CI
- 特徴:
.github/workflowsに YAML を書くだけで、ブランチやタグに応じたパイプラインを柔軟に組める。 - 公式: https://docs.github.com/actions
私の場合は、feature/** ブランチへの push をトリガーに:
make install-toolsmake lintmake test
を自動で回すワークフローを用意しています。
VS Code の開発環境
私はプライベートでは VS Code を前提に開発しており、主に次の拡張を使っています。
- Go (golang.go)
- GitHub Copilot
- GitHub Copilot Chat
- Prettier SQL VSCode
VS Code 設定例 (settings.json)
{
"terminal.integrated.suggest.enabled": true,
"files.autoSave": "afterDelay",
// Format on Save (保存時に整形) を有効化
"editor.formatOnSave": true,
"editor.insertSpaces": false,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
"go.lintOnSave": "package", // ファイル保存時にパッケージ全体をLintする
"go.lintTool": "golangci-lint", // 使用するLinterツールを指定
"go.useLanguageServer": true, // goplsを使用
"go.formatTool": "gofumpt", // goplsに整形を任せる
"go.lintFlags": [
"--config=${workspaceFolder}/.golangci.yaml",
"--fast" // 高速モードで実行
],
"gopls": {
// goplsが提供する一部の機能(静的解析)を無効化し、golangci-lintに任せる
"analyses": {
"unusedparams": false,
"shadow": false
},
"completeUnimported": true // インポートされていないパッケージの補完を有効化
},
"github.copilot.nextEditSuggestions.enabled": true,
"go.testEnvFile": "${workspaceFolder}/.env.local",
"go.toolsEnvVars": {
// goplsが使用する環境変数を設定
"GOFLAGS": "-tags=wireinject"
}
}
MCP / Serena
GitHub Copilot Chat に加えて Model Context Protocol (MCP) を利用し、リポジトリを横断したコードリーディングやリファクタリング支援を行います。
-
Serena (MCP サーバー)
- 用途: コードベース全体のシンボル検索・参照検索・部分編集などを、Copilot から対話的に行うための MCP サーバー
- 特徴: 「このユースケースに関連するドメイン・インフラ・テストをまとめて追いたい」といったときに、IDE 内でコードナビゲーションと編集をまとめて依頼できる。
.vscode/mcp.json に Serena の設定を置くことで、VS Code の Copilot Chat から「このプロジェクトを理解した状態の AI エージェント」として使えるようにしています。
まとめ
このエントリでは、私が Go の開発で使っているツールや VS Code の拡張機能を、用途別にざっと紹介しました。
- 言語は Go、DB は PostgreSQL、ORM は ent
- ローカル開発は Docker / Docker Compose + Make + air
- Observability は OpenTelemetry + zap
- API 定義は protobuf / gRPC / gRPC-Gateway を buf で管理
- 品質管理は gofumpt / golangci-lint
- DI / テスト補助に wire / go-cmp / mock
- エディタは VS Code + Go 拡張 + Copilot + Prettier SQL
- 裏側で MCP / Serena を使い、Copilot Chat からリポジトリ全体に対する操作を行っている
同じように Go で API を作るとき、「このあたりのツールを組み合わせるとこんな感じになる」というカタログとして使ってもらえたらうれしいです。