問題の概要スムーズなコンパイルを期待して go build ./... を実行したものの、コンパイラが停止してしまうことがあります。エディタ上にはファイルが存在しているにもかかわらず、特定のディレクトリを指して「Goファイルが見つからない」と表示されます。このエラーは、Goが「ファイルは見つかったが、現在の設定ではすべてのファイルを無視するように指示されている」と伝えている状態です。
なぜGoはファイルをスキップするのかGoはビルド制約(またはビルドタグ)を使用して、特定のバイナリに含めるファイル群を決定します。例えば、macOSでビルドしているのに、ファイルがWindows専用である場合、Goはそれらを除外します。このフィルタリングの結果、コンパイル対象のファイルがゼロになると、このエラーが発生します。主な原因は以下の4つです。
- OS/Archサフィックス:
disk_windows.goのようなファイル名は、LinuxやmacOSでのビルド時には無視されます。- 厳格なビルドタグ://go:build integrationで始まるファイルは、標準の実行時にはコンパイルされません。- 「テストのみ」の罠: フォルダ内に*_test.goファイルしか存在しない場合です。パッケージを定義するには、少なくとも1つの通常の.goファイルが必要です。- 予約済みのプレフィックス: Goはドット (.git) やアンダースコア (_vendor) で始まるディレクトリを完全に無視します。## 解決方法### 1. プラットフォーム固有のサフィックスを確認する/pkgディレクトリにservice_windows.goしか含まれておらず、MacBook (Darwin) で実行している場合、ビルドは失敗します。Goのツールチェーンは、_linux、_windows、_amd64といったサフィックスを自動的に識別します。
# ディレクトリの内容を確認
ls pkg/
# 出力: logic_windows.go logic_windows_test.go
これを修正するには、共有コード用に logic.go のようなプラットフォームに依存しないファイルを作成します。あるいは、現在の環境をサポートするために logic_darwin.go を追加します。
2. ビルドタグを検証するモダンなGo(1.17以降)では、ファイルの先頭で //go:build 構文を使用します。ファイルがカスタムタグによって隠されていないか確認してください。
//go:build pro_version
package pkg
このタグが存在する場合、標準の go build ではファイルがスキップされます。コマンドで明示的にタグを指定する必要があります。
go build -tags=pro_version ./...
また、//go:build ignore ディレクティブにも注意してください。これは、メインのバイナリに含めたくないスクリプトやツールによく使用されます。
3. 「空のパッケージ」ミスGoでは、すべてのパッケージディレクトリに少なくとも1つのテスト用ではないファイルが必要です。フォルダ構成が以下のようになっている場合:
pkg/
└── logic_test.go
テストのコンテキストを提供する logic.go が存在しないため、コンパイラはエラーを出します。package pkg と記述したファイルを追加するだけで、コンパイラを満足させることができます。
プロのデバッグ技Goがどのファイルを認識しているか推測するのはやめましょう。go list ツールを使用して、ビルドシステムから見た状況を確認します。プロジェクトのルートから次のコマンドを実行してください。
go list -f '{{.GoFiles}}' ./pkg
空のリスト [] が返される場合、制約が厳しすぎます。[logic.go] が返されれば解決です。また、-json フラグを追加して IgnoredGoFiles フィールドを確認することで、どのファイルがなぜ無視されているかを確認することもできます。

