Go(Golang)は、シンプルで高速な実行環境を提供するプログラミング言語です。
そのGo言語を扱う上で欠かせないのが、「goコマンド」です。
「go runって何?」
「buildとinstallの違いは?」
そんな疑問を持つ方に向けて、この記事ではGoコマンドの全体像と実用的な使い方を徹底解説します。
基本コマンド:まずはこれだけ覚えよう
go run:ファイルをその場で実行
基本的な使い方
go run main.go
複数ファイルを同時に実行
go run main.go utils.go
ディレクトリ全体を実行
go run .
どんなときに使う?
- プログラムをちょっと試したいとき
- 開発中の動作確認
- 学習やテスト段階
内部では何が起こってる?
- 一時的にコンパイル
- メモリ上で実行
- 実行後、一時ファイルは自動削除
go build:実行可能ファイルを作成
基本的な使い方
# 現在のディレクトリをビルド
go build
# 特定のファイルをビルド
go build main.go
# 出力ファイル名を指定
go build -o myapp main.go
クロスコンパイル(他のOS用にビルド)
# Windows用(Linuxから)
GOOS=windows GOARCH=amd64 go build -o myapp.exe
# Linux用(Windowsから)
GOOS=linux GOARCH=amd64 go build
# macOS用
GOOS=darwin GOARCH=amd64 go build
ビルド結果の例
# ビルド前
$ ls
main.go
# ビルド後
$ go build
$ ls
main.go myproject
使用場面
- 本番環境にデプロイするとき
- 他の人にプログラムを配布するとき
- 実行速度を重視するとき
go install:バイナリをシステムに配置
基本的な使い方
# 現在のプロジェクトをインストール
go install
# 外部ツールをインストール
go install github.com/user/tool@latest
インストール場所
# インストール先の確認
$ go env GOPATH
/home/user/go
# 実際のバイナリの場所
/home/user/go/bin/tool
PATHの設定
# ~/.bashrc または ~/.zshrc に追加
export PATH=$PATH:$(go env GOPATH)/bin
実用例
# よく使うツールのインストール
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go fmt:コード整形
基本的な使い方
# 1つのファイルを整形
go fmt main.go
# 現在のディレクトリとサブディレクトリを全て整形
go fmt ./...
# 特定のディレクトリを整形
go fmt ./src/...
整形前後の例
// 整形前
package main
import "fmt"
func main(){
fmt.Println("Hello, World!")
}
// 整形後
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
エディタとの連携
# VS Code の場合、settings.json に追加
{
"go.formatTool": "gofmt",
"editor.formatOnSave": true
}
モジュール・依存関係コマンド:Go Modules対応
go mod init:新規モジュールを作成
基本的な使い方
# 新しいモジュールを作成
go mod init example.com/myapp
# プロジェクト名のみで作成(シンプル版)
go mod init myapp
作成されるファイル
// go.mod
module example.com/myapp
go 1.21
実際のプロジェクト開始手順
# 1. プロジェクトディレクトリを作成
mkdir myproject
cd myproject
# 2. Go モジュールを初期化
go mod init github.com/username/myproject
# 3. メインファイルを作成
echo 'package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}' > main.go
# 4. 実行確認
go run main.go
go mod tidy:依存関係を整理
基本的な使い方
go mod tidy
何が起こる?
- 未使用の依存を削除:コードで使っていないパッケージをgo.modから削除
- 必要な依存を追加:importしているけどgo.modにないパッケージを追加
- go.sumファイルを更新:依存パッケージのハッシュ値を記録
実行例
# 実行前の go.mod
module myapp
go 1.21
require (
github.com/gin-gonic/gin v1.9.1
github.com/unused/package v1.0.0 // 実際には使っていない
)
# go mod tidy 実行後
module myapp
go 1.21
require github.com/gin-gonic/gin v1.9.1
いつ実行する?
- 新しいパッケージをimportした後
- 不要なimportを削除した後
- プロジェクトをクリーンアップしたいとき
go get:外部パッケージの取得
基本的な使い方
# 最新版を取得
go get github.com/gin-gonic/gin
# 特定のバージョンを取得
go get github.com/gin-gonic/gin@v1.9.1
# 最新のコミットを取得
go get github.com/gin-gonic/gin@latest
バージョン指定の方法
# セマンティックバージョン
go get github.com/pkg/errors@v0.9.1
# ブランチ指定
go get github.com/user/repo@main
# コミットハッシュ指定
go get github.com/user/repo@abc123
# 特定のタグ
go get github.com/user/repo@v2.0.0
パッケージの更新
# 全ての依存を最新に更新
go get -u ./...
# 特定のパッケージを更新
go get -u github.com/gin-gonic/gin
パッケージの削除
# パッケージを削除(コードからimportも削除する必要あり)
go get github.com/unwanted/package@none
go list:モジュール情報の確認
現在のモジュール情報
# 全ての依存モジュールを表示
go list -m all
# 現在のモジュールのみ表示
go list -m
# 利用可能なバージョンを表示
go list -m -versions github.com/gin-gonic/gin
パッケージ情報の表示
# 現在のプロジェクトのパッケージ一覧
go list ./...
# 外部パッケージの情報
go list github.com/gin-gonic/gin
# 依存関係の詳細表示
go list -deps ./...
テスト・検証系コマンド:品質を保つ必須操作
go test:テストを実行
基本的な使い方
# 現在のディレクトリのテストを実行
go test
# 全てのサブディレクトリのテストを実行
go test ./...
# 特定のパッケージのテストを実行
go test ./internal/auth
詳細表示とオプション
# 詳細表示(テスト関数名も表示)
go test -v
# カバレッジを表示
go test -cover
# カバレッジの詳細をファイルに出力
go test -coverprofile=coverage.out
go tool cover -html=coverage.out
テストファイルの例
// math_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {
t.Errorf("Add(2, 3) = %d; want %d", result, expected)
}
}
特定のテストだけ実行
# 特定のテスト関数だけ実行
go test -run TestAdd
# パターンマッチで複数のテストを実行
go test -run "Test.*User"
ベンチマークテスト
ベンチマークの実行
# 全てのベンチマークを実行
go test -bench=.
# 特定のベンチマークを実行
go test -bench=BenchmarkAdd
# メモリ使用量も測定
go test -bench=. -benchmem
ベンチマークテストの例
// math_test.go
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}
ベンチマーク結果の見方
BenchmarkAdd-8 1000000000 0.25 ns/op 0 B/op 0 allocs/op
# ↑実行回数 ↑1回あたり ↑メモリ ↑メモリ確保回数
テストの並列実行
# 並列でテストを実行(高速化)
go test -parallel 4 ./...
# タイムアウトを設定
go test -timeout 30s ./...
情報・調査系:内部構造や環境を知る
go env:環境設定の確認
全ての環境変数を表示
go env
特定の環境変数を確認
# Go のルートディレクトリ
go env GOROOT
# ワークスペースのディレクトリ
go env GOPATH
# 現在のOS/アーキテクチャ
go env GOOS GOARCH
# モジュールキャッシュの場所
go env GOMODCACHE
環境変数の設定
# プロキシの設定
go env -w GOPROXY=https://proxy.golang.org,direct
# プライベートモジュールの設定
go env -w GOPRIVATE=github.com/mycompany/*
よく使う環境変数
# 重要な環境変数の確認
echo "GOROOT: $(go env GOROOT)"
echo "GOPATH: $(go env GOPATH)"
echo "GOOS: $(go env GOOS)"
echo "GOARCH: $(go env GOARCH)"
echo "GO111MODULE: $(go env GO111MODULE)"
go version:バージョン情報
Goのバージョン確認
# 基本のバージョン表示
go version
# より詳細な情報
go version -m /path/to/binary
バージョン管理のベストプラクティス
# プロジェクトのgo.modでバージョンを固定
go 1.21
# CI/CDでのバージョン固定例
# Dockerfile
FROM golang:1.21-alpine
go doc:ドキュメントの確認
パッケージのドキュメント表示
# 標準パッケージのドキュメント
go doc fmt
# 特定の関数のドキュメント
go doc fmt.Println
# 現在のパッケージのドキュメント
go doc
# 外部パッケージのドキュメント
go doc github.com/gin-gonic/gin
ローカルドキュメントサーバー
# Go 1.12以降では別途インストールが必要
go install golang.org/x/tools/cmd/godoc@latest
# ローカルサーバーを起動
godoc -http=:6060
# ブラウザで http://localhost:6060 にアクセス
go help:ヘルプの表示
基本的なヘルプ
# 全コマンドの一覧
go help
# 特定のコマンドのヘルプ
go help build
go help test
go help mod
詳細なヘルプトピック
# モジュールに関する詳細ヘルプ
go help modules
# インポートパスに関するヘルプ
go help importpath
# ビルドモードに関するヘルプ
go help buildmode
より高度なコマンドとオプション
go vet:コードの静的解析
基本的な使い方
# 現在のパッケージを解析
go vet
# 全てのサブパッケージを解析
go vet ./...
検出される問題の例
- 使われていない変数
- 到達不可能なコード
- Printf関数の引数不整合
- 構造体のコピー問題
go tool:開発ツール
よく使うツール
# カバレッジレポートの生成
go tool cover -html=coverage.out
# CPUプロファイルの確認
go tool pprof cpu.prof
# ヒープダンプの解析
go tool pprof heap.prof
# アセンブリコードの表示
go tool objdump binary
go clean:キャッシュのクリア
各種キャッシュのクリア
# ビルドキャッシュをクリア
go clean -cache
# モジュールキャッシュをクリア
go clean -modcache
# テストキャッシュをクリア
go clean -testcache
実践的な使い方とワークフロー
新しいプロジェクトの開始
# 1. プロジェクトディレクトリの作成
mkdir awesome-project
cd awesome-project
# 2. Go モジュールの初期化
go mod init github.com/username/awesome-project
# 3. 基本的なファイル構造の作成
mkdir cmd internal pkg
touch cmd/main.go
touch README.md
# 4. 依存パッケージの追加
go get github.com/gin-gonic/gin
go get github.com/spf13/cobra
# 5. 依存関係の整理
go mod tidy
日常的な開発ワークフロー
# コードの整形
go fmt ./...
# 静的解析
go vet ./...
# テストの実行
go test -v ./...
# カバレッジの確認
go test -cover ./...
# ビルドの確認
go build -o bin/app ./cmd/
CI/CDでの活用
GitHub Actionsの例
name: Go CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Get dependencies
run: go mod download
- name: Format check
run: |
go fmt ./...
git diff --exit-code
- name: Vet
run: go vet ./...
- name: Test
run: go test -v -cover ./...
- name: Build
run: go build -v ./...
Makefileでの自動化
.PHONY: fmt vet test build clean
fmt:
go fmt ./...
vet:
go vet ./...
test:
go test -v ./...
test-cover:
go test -cover ./...
build:
go build -o bin/app ./cmd/
clean:
go clean -cache
rm -rf bin/
all: fmt vet test build
パフォーマンスとデバッグ
プロファイリング
CPUプロファイル
# プロファイルを有効にしてビルド
go build -o app
./app -cpuprofile=cpu.prof
# プロファイルの確認
go tool pprof cpu.prof
メモリプロファイル
# メモリプロファイルの取得
go test -memprofile=mem.prof -bench=.
# メモリ使用量の確認
go tool pprof mem.prof
デバッグ情報付きビルド
# デバッグ情報を含めてビルド
go build -gcflags="all=-N -l" -o debug-app
# リリース用最適化ビルド
go build -ldflags="-s -w" -o release-app
よくある問題と解決方法
モジュール関連の問題
「module not found」エラー
# 解決方法1: go.modの確認
cat go.mod
# 解決方法2: モジュールキャッシュのクリア
go clean -modcache
# 解決方法3: 依存関係の再取得
go mod download
プライベートリポジトリの問題
# プライベートリポジトリの設定
go env -w GOPRIVATE=github.com/mycompany/*
go env -w GONOPROXY=github.com/mycompany/*
go env -w GONOSUMDB=github.com/mycompany/*
ビルド関連の問題
クロスコンパイルできない
# CGO を無効にしてビルド
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
# 利用可能なOS/アーキテクチャの確認
go tool dist list
便利なエイリアス設定
# ~/.bashrc または ~/.zshrc に追加
alias gob='go build'
alias gor='go run'
alias got='go test'
alias gotv='go test -v'
alias gotc='go test -cover'
alias gof='go fmt ./...'
alias gov='go vet ./...'
alias gom='go mod'
alias gomt='go mod tidy'
alias gomi='go mod init'
まとめ
Go言語の開発において、goコマンドは欠かせないツールです。この記事で紹介したコマンドを使いこなすことで、効率的な開発ワークフローを構築できます。
重要なポイント
- 基本コマンド:
run
、build
、install
、fmt
- モジュール管理:
mod init
、mod tidy
、get
- 品質管理:
test
、vet
、doc
- 環境確認:
env
、version
、help
ベストプラクティス
- 定期的に
go fmt ./...
でコードを整形 go mod tidy
で依存関係をクリーンに保つgo test ./...
でテストを習慣化go vet ./...
で静的解析を実行
コメント