Der Befehl „go generic“ wird verwendet, um vor der Kompilierung automatisch einen bestimmten Codetyp zu generieren. Er wird häufig zum automatischen Generieren von Code verwendet und kann Code basierend auf dem Quellcode generieren, bevor der Code kompiliert wird. Wenn der Befehl „go generic“ ausgeführt wird, werden die Quellcodedateien des aktuellen Pakets gescannt, alle speziellen Kommentare gefunden, die „//go:generate“ enthalten, der Befehl nach dem speziellen Kommentar extrahiert und ausgeführt.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Go-Sprache bietet eine Reihe leistungsstarker Tools, die die Entwicklung unseres Projekts erleichtern können.
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
Der Quellcode des Tools befindet sich in $GOPATH/src/cmd/internal. In diesem Artikel geht es hauptsächlich um die Generierung des Go-Tools.
Der Befehl „Go Generate“ ist ein neu hinzugefügter Befehl in der Go-Sprachversion 1.4. Er wird häufig zum automatischen Generieren von Code verwendet, bevor der Code kompiliert wird . Beim Ausführen von go generic werden die Quellcodedateien des aktuellen Pakets gescannt, alle Kommentaranweisungen gefunden, die „// go:generate“ enthalten, der Befehl nach dem Kommentar extrahiert und ausgeführt, und der Befehl ist ein ausführbares Programm. Der Vorgang ähnelt dem Aufrufen und Ausführen eines Shell-Skripts.
//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!")}
Führen Sie den Befehl „go generic“ aus
$ go generate GoGoGo!go rum main.go!amd64 darwin main.go 7 main
Nachdem Sie die obige kurze Einführung gelesen haben generieren, spüren die Leser das vielleicht nicht Aufgrund der Leistungsfähigkeit des Tools bietet Xiaocai Knife ein klassisches Anwendungsszenario dieses Tools: die Implementierung der String-Methode für Aufzählungskonstanten.
Ein weiteres offizielles Tool, Stringer, muss hier erwähnt werden, das automatisch die String()-Methode für einen Satz ganzzahliger Konstanten schreiben kann. Da Stringer nicht im Toolset der offiziellen Go-Version enthalten ist, müssen wir ihn selbst installieren und den folgenden Befehl ausführen.
go get golang.org/x/tools/cmd/stringer
Hier ist ein Beispiel aus der Stringer-Dokumentation. Der Code lautet wie folgt und definiert einen Satz ganzzahliger Konstanten verschiedener Pill-Typen.
package painkillertype Pill intconst ( Placebo Pill = iota Aspirin Ibuprofen Paracetamol Acetaminophen = Paracetamol)
Zum Debuggen oder aus anderen Gründen möchten wir, dass diese Konstanten gedruckt werden, was bedeutet, dass Pill eine Methode mit einer Signatur hat.
func (p Pill) String() string
Um es zu erreichen, ist es ganz einfach.
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)}
Stellen Sie sich vor, wenn wir der Pillenliste eine Reihe von Medikamentennamen hinzufügen, muss jedes Mal, wenn der Medikamentenname hinzugefügt oder geändert wird, auch die entsprechende Signaturfunktion geändert werden. Wäre das nicht umständlich und würde es wahrscheinlich übersehen oder falsch sein? Zu diesem Zeitpunkt können wir dieses Problem durch Go Generate + Stringer lösen. Es ist ganz einfach: Fügen Sie einfach eine Kommentaranweisung zum Code hinzu, der Pill definiert.
//go:generate stringer -type=Pill
Der obige Befehl stellt das Ausführen des Stringer-Tools dar, um eine String-Methode für den Pill-Typ zu generieren. Standardmäßig wird sie in die Datei pill_string.go ausgegeben.
$ 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]]}
Auf diese Weise müssen wir jedes Mal, wenn wir den Pill-Typ ändern, nur die folgende Anweisung ausführen.
$ go generate
Natürlich, wenn Sie dies als problematisch empfinden oder befürchten, die Ausführung der Generate-Anweisung zu vergessen. Anschließend können Sie die go-generate-Anweisung in das Makefile schreiben und vor dem go-build-Befehl platzieren, um die Codegenerierung und -kompilierung zu automatisieren.
Es ist erwähnenswert, dass in den Go-Quellcodedokumenten die Go-Generate+Stringer-Lösung häufig verwendet wird, um die String-Methode für Aufzählungskonstanten zu implementieren. Unter dem Quellcode von Xiaocai Knifes nativem Go 1.14.1 gibt es insgesamt 23 Verwendungszwecke, wie folgt.
In diesem Artikel wird hauptsächlich vorgestellt, was Generieren ist und was es tun kann. Wenn Sie die interne Implementierungslogik genau verstehen möchten, können Sie sich den detaillierten Prozess der Codegenerierung in Go ansehen Quellcode, z. B. durch Übergeben unter dem Sortierpaket genzfunc.go, implementiert die Generierung von zfuncversion.go. In der Schatzkammer des Go-Quellcodes finden Sie viele ähnliche Implementierungslogiken. Weitere Informationen finden Sie im Folgenden.
Sie nutzen die vom Go-Compiler bereitgestellten Bibliotheken, einschließlich go/ast zum Definieren abstrakter Syntaxbäume, go/parser zum Parsen abstrakter Syntaxbäume, go/format zum Parsen der Codeformatierung, go/token für lexikalische Go-Tags usw. . Analysieren Sie die Quelldatei und generieren Sie neuen Code gemäß der vorhandenen Vorlage. Dieser Vorgang ähnelt der Verwendung von Vorlagen zum Generieren von HTML-Dateien in Webdiensten.
【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht】
Das obige ist der detaillierte Inhalt vonWelche Funktion hat der Go-Generate-Befehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!