【保存版】Go言語の「goコマンド」一覧と使い方まとめ|初心者から中級者まで役立つCLIチートシート!

Go

Go(Golang)は、シンプルで高速な実行環境を提供するプログラミング言語です。

そのGo言語を扱う上で欠かせないのが、「goコマンド」です。

「go runって何?」
「buildとinstallの違いは?」
そんな疑問を持つ方に向けて、この記事ではGoコマンドの全体像と実用的な使い方を徹底解説します。

スポンサーリンク

基本コマンド:まずはこれだけ覚えよう

go run:ファイルをその場で実行

基本的な使い方

go run main.go

複数ファイルを同時に実行

go run main.go utils.go

ディレクトリ全体を実行

go run .

どんなときに使う?

  • プログラムをちょっと試したいとき
  • 開発中の動作確認
  • 学習やテスト段階

内部では何が起こってる?

  1. 一時的にコンパイル
  2. メモリ上で実行
  3. 実行後、一時ファイルは自動削除

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

何が起こる?

  1. 未使用の依存を削除:コードで使っていないパッケージをgo.modから削除
  2. 必要な依存を追加:importしているけどgo.modにないパッケージを追加
  3. 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コマンドは欠かせないツールです。この記事で紹介したコマンドを使いこなすことで、効率的な開発ワークフローを構築できます。

重要なポイント

  • 基本コマンドrunbuildinstallfmt
  • モジュール管理mod initmod tidyget
  • 品質管理testvetdoc
  • 環境確認envversionhelp

ベストプラクティス

  • 定期的にgo fmt ./...でコードを整形
  • go mod tidyで依存関係をクリーンに保つ
  • go test ./...でテストを習慣化
  • go vet ./...で静的解析を実行

コメント

タイトルとURLをコピーしました