プログラミング言語 golang go build gogenerate コマンド – コンパイル前に特定のタイプのコードを自動的に生成します

gogenerate コマンド – コンパイル前に特定のタイプのコードを自動的に生成します

 
 
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]]
} 
 

「 gogenerate コマンド – コンパイル前に特定のタイプのコードを自動的に生成します」についてわかりやすく解説!絶対に観るべき

Gitを使ったクローン、プルリク、マージの流れについて解説