go generate
コマンドは Go 言語のバージョン 1.4 で追加された新しいコマンドです。このコマンドを実行すると、現在のパッケージに関連するソース コード ファイルがスキャンされ、 //go:generate
を含む特別なコメントがすべて検出され、抽出して実行されます。この特別なコメントの後にコマンドを追加します。
go generate
コマンドを使用する場合は、次の点に注意する必要があります。
- この特別なコメントは .go ソース コード ファイル内に存在する必要があります。
- 各ソース コード ファイルには、複数の生成された特別なコメントを含めることができます。
go generate
コマンドを実行すると、特別なコメントに続くコマンドが実行されます。go generate
コマンドがエラーを実行すると、プログラムの実行は終了します。- 特別なコメントは
//go:generate
で始まり、二重スラッシュの後にスペースを入れる必要はありません。
次のシナリオでは、 go generate
コマンドを使用します。
- yacc: .y ファイルから .go ファイルを生成します。
- protobufs: プロトコル バッファー定義ファイル (.proto) から .pb.go ファイルを生成します。
- Unicode: UnicodeData.txt から Unicode テーブルを生成します。
- HTML: HTML ファイルを go ソース コードに埋め込みます。
- bindingata: Go コードで JPEG などのファイルをバイト配列に変換します。
もう一つの例:
- string メソッド: 列挙定数などの型の String() メソッドを生成します。
- マクロ: int の sort.Ints など、特定の汎用パッケージの特定の実装を生成します。
go generate
コマンドの形式は次のとおりです。
go generate [-run regexp] [-n] [-v] [-x] [command] [build flags] [file.go… | packages]
パラメータは次のように説明されます。
- -run 正規表現はコマンドラインと一致し、一致したコマンドのみが実行されます。
- -v 処理されたパッケージ名とソースファイル名を出力します。
- -n はコマンドが実行されないことを示します。
- -x コマンドを表示および実行します。
- command には、環境変数 PATH 内の任意のコマンドを指定できます。
go generate
コマンドを実行するときは、次のようにいくつかの環境変数を使用することもできます。
- $GOARCH アーキテクチャ (arm、amd64 など);
- $GOOS 現在の OS 環境 (Linux、Windows など);
- $GOFILE 現在処理中のファイルの名前。
- $GOLINE ファイル内の現在のコマンドの行番号。
- $GOPACKAGE 現在処理されているファイルのパッケージ名。
- $DOLLAR
$
を修正しました。何を使用すればよいかわかりません。
[例 1] 次の内容を含む main.go ファイルがあるとします。
package main
import "fmt"
//go:generate go run main.go
//go:generate go version
func main() {
fmt.Println("https://it-kiso.com/golang/")
}
go generate -x
コマンドを実行すると、出力は次のようになります。
go generate -x
go run main.go
https://it-kiso.com/golang/
go version
go version go1.13.6 windows/amd64
実行結果から、 //go:generate
の後のコマンドが正常に実行されており、コマンドで使用されている-x
パラメーターは、同時に実行された特定のコマンドを出力することになっていることがわかります。
以下では、ストリンガー ツールを使用してgo generate
コマンドの使用方法を示します。
stringer は Go 言語に付属するツールではないため、手動でインストールする必要があります。次のコマンドを使用してストリンガー ツールをインストールできます。
go get golang.org/x/tools/cmd/stringer
上記のコマンドは壁を迂回する必要があります。条件が許せない場合は、Github上のミラーイメージからインストールすることも可能です。
git clone https://github.com/golang/tools/ $GOPATH/src/golang.org/x/tools
go install golang.org/x/tools/cmd/stringer
インストールされたストリンガーツールは GOPATH/bin ディレクトリにありますが、通常使用する場合は、まず GOPATH/bin ディレクトリをシステム環境変数 PATH に追加する必要があります。
[例 2] ストリンガー ツールを使用して String() メソッドを実装します。
まず、プロジェクト ディレクトリの下に新しい painkiller フォルダーを作成し、そのフォルダー内に次のようなファイル painkiller.go を作成します。
//go:generate stringer -type=Pill
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
次に、painkiller.go ファイルと同じディレクトリでgo generate
コマンドを実行します。
実行が成功した後は、プロンプト メッセージは表示されませんが、現在のディレクトリに pig_string.go ファイルが生成されます。必要な String() メソッドがそのファイルに実装されています。ファイルの内容は次のとおりです。
// 「stringer -type=Pill」によって生成されたコードです。編集しないでください。
package painkiller
import "strconv"
func _() {
// 「無効な配列インデックスエラー」は、定数値が変更されたことを示します。
// 再度stringerコマンドを実行して、再生成してください。
var x [1]struct{}
_ = x[Placebo-0]
_ = x[Aspirin-1]
_ = x[Ibuprofen-2]
_ = x[Paracetamol-3]
}
const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"
var _Pill_index = [...]uint8{0, 7, 14, 23, 34}
func (i Pill) String() string {
if i < 0 || i >= Pill(len(_Pill_index)-1) {
return "Pill(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}