導入
Go言語でWindows向けのツールやアプリケーションを開発する際、実行するたびに真っ黒なコマンドプロンプト(コンソール)が立ち上がることに煩わしさを感じたことはありませんか?特にバックグラウンドで動作する常駐ソフトや、GUIを持つアプリケーションを作成する場合、このコンソール画面は不要です。今回は、Goのビルドオプションを活用して、このコンソールウィンドウを非表示にする方法を解説します。
基礎知識
Windowsの実行ファイル(EXE)には「サブシステム」という属性が存在します。通常、Goでビルドされたプログラムは「CONSOLE」サブシステムとして扱われるため、起動時にOSが自動的にコンソールウィンドウを生成します。これを「WINDOWS」サブシステムに変更することで、OSに対して「このプログラムはコンソールを必要としない」と伝えることができます。これを制御するのがリンカオプションの -H windowsgui です。
実装/解決策
Goのコンパイラである go build コマンドに対し、リンカフラグを渡すことで解決します。具体的には -ldflags というオプションを使用し、その中で -H windowsgui を指定します。
コマンドラインで実行する場合の形式は以下の通りです。
go build -ldflags “-H windowsgui” -o app.exe main.go
これにより、生成された app.exe をダブルクリックしても、背後のコンソール画面が表示されなくなります。
サンプルプログラム
以下のコードを main.go として保存し、前述のコマンドでビルドしてみてください。
package main
import (
"fmt"
"os"
)
func main() {
// コンソール非表示設定をすると標準出力は見えなくなります。
// 代わりにログファイルへ書き出すなどの実装が推奨されます。
f, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return
}
defer f.Close()
// 動作確認としてファイルに書き込みを行います
fmt.Fprintln(f, "アプリケーションが正常に起動しました(コンソールは非表示です)")
}
応用・注意点
注意点として、-H windowsgui を指定すると、標準出力(Stdout)や標準エラー出力(Stderr)がOSから切り離されるため、fmt.Println 等で画面にメッセージを出しても何も表示されません。デバッグ時には注意が必要です。
応用としては、開発中は通常の go run でデバッグし、配布用バイナリを作成する際のみビルドスクリプトや Makefile で -ldflags を付与するように運用するのが一般的です。また、本格的なGUIアプリを作成する場合は、fyne や walk といったライブラリを併用することで、より快適な開発が可能になります。Windows環境でのツール作成時には、ぜひこの設定を活用してみてください。

コメント