概要
ちょっとしたTIPSです。
Goでは main パッケージの中に main 関数があればそれがエントリポイントになりますね。
で、当たり前ですが複数のmain関数が定義されているとビルドエラーになります。
でも、go run
で実行するのは出来ます。
$ ls -1 go.mod main2.go main.go # main関数がダブっているのでビルドエラー $ go build . # multimainfunc ./main2.go:5:6: main redeclared in this block previous declaration at ./main.go:5:6 # go run は可能 $ go run main.go main1 $ go run main2.go main2
個人的に、ちょっとした動作確認向けの main 関数とかを複数定義したりするのはよくやります。(テストケースとか他のディレクトリを作ってそっちにmain書いたりするのが面倒くさいw)
この状態で、ビルド出来るようにするためにビルドタグを使うとちょっと便利です。
ビルドタグを付ける
上記のようなときに、本番ファイルを main.go
、確認用を main2.go
とすると、main2.go
側にビルドタグをつけておいてあげます。
// +build run package main import "fmt" func main() { fmt.Println("main2") }
+build
の前に一つ半角スペースを入れることと、一行空けることに注意です。
ビルドタグを付与すると、ビルド時にそのタグが指定されていない場合はビルド対象にならないのを利用しています。
でも、go run
するときは ビルドタグ とか無視なので、実行できると。
タグの名前は別に run
とかじゃなくて何でもいいのですが、慣例的に run
ってするみたいですね。大抵この名前で見かけます。
ビルドタグを付与しておいたので、今度はビルドが通ります。
$ ls -1 go.mod main2.go main.go $ head -n 1 main.go package main $ head -n 3 main2.go // +build run package main # 今度はビルドが成功します $ go build . # go run も可能 $ go run main.go main1 $ go run main2.go main2
参考資料
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場