いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-151 (mainパッケージの中でビルドタグ使って複数のmain関数を定義)(+build run)

概要

ちょっとした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

参考資料

golang.org

qiita.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com