「gogenerate」コマンドは、コンパイル前に特定のタイプのコードを自動的に生成するために使用されます。多くの場合、コードの自動生成に使用され、コードがコンパイルされる前にソース コードに基づいてコードを生成できます。 「go generated」コマンドを実行すると、現在のパッケージに関連するソース コード ファイルがスキャンされ、「//go:generate」を含むすべての特別なコメントが検索され、特別なコメントに続くコマンドが抽出されて実行されます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語には一連の強力なツールが用意されています。これらのツールを柔軟に使用すると、プロジェクトの開発が容易になります。ツールセットには次のものが含まれます。
bug start a bug report build compile packages and dependencies clean remove object files and cached files doc show documentation for package or symbol env print Go environment information fix update packages to use new APIs fmt gofmt (reformat) package sources generate generate Go files by processing source get add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packages
ツールのソース コードは $GOPATH/src/cmd/internal にあります。この記事では主に Go ツールの生成について説明します。
go generated コマンドは、Go 言語バージョン 1.4 で新しく追加されたコマンドで、よく使用されます。自動コード生成の場合、コードがコンパイルされる前にソース コードからコードを生成します。 gogenerate を実行すると、現在のパッケージに関連するソース コード ファイルがスキャンされ、「//go:generate」を含むすべてのコメント ステートメントが検索され、コメントの後のコマンドが抽出されて実行されます。コマンドは実行可能プログラムになります。このプロセスは、シェル スクリプトの呼び出しと実行に似ています。
//go:generate command argument...
$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
package mainimport "fmt"//go:generate echo GoGoGo!//go:generate go run main.go//go:generate echo $GOARCH $GOOS $GOFILE $GOLINE $GOPACKAGEfunc main() { fmt.Println("go rum main.go!")}
$ go generate GoGoGo!go rum main.go!amd64 darwin main.go 7 main
go get golang.org/x/tools/cmd/stringer
package painkillertype Pill intconst ( Placebo Pill = iota Aspirin Ibuprofen Paracetamol Acetaminophen = Paracetamol)
func (p Pill) String() string
func (p Pill) String() string { switch p { case Placebo: return "Placebo" case Aspirin: return "Aspirin" case Ibuprofen: return "Ibuprofen" case Paracetamol: // == Acetaminophen return "Paracetamol" } return fmt.Sprintf("Pill(%d)", p)}
//go:generate stringer -type=Pill
$ go generate $ cat pill_string.go // Code generated by stringer -type Pill pill.go; DO NOT EDIT. package painkillerimport "fmt"const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"var _Pill_index = [...]uint8{0, 7, 14, 23, 34}func (i Pill) String() string { if i = Pill(len(_Pill_index)) { return fmt.Sprintf("Pill(%d)", i) } return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]}
$ go generate
これらは、抽象構文ツリーを定義するための go/ast、抽象構文ツリーを解析するための go/parser、コードの書式設定を解析するための go/format、Go 字句タグ用の go/ など、Go コンパイラによって提供されるライブラリを使用します。等ソース ファイルを解析し、既存のテンプレートに従って新しいコードを生成します。このプロセスは、Web サービスでテンプレートを使用して HTML ファイルを生成するのと似ています。
【関連する推奨事項: Go ビデオ チュートリアル 、プログラミング教育 】
以上がgogenerateコマンドの機能は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。