Heim Backend-Entwicklung Golang Welche Funktion hat der Go-Generate-Befehl?

Welche Funktion hat der Go-Generate-Befehl?

Jan 30, 2023 pm 03:07 PM
golang go语言

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.

Welche Funktion hat der Go-Generate-Befehl?

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
Nach dem Login kopieren

Der Quellcode des Tools befindet sich in $GOPATH/src/cmd/internal. In diesem Artikel geht es hauptsächlich um die Generierung des Go-Tools.

Go-Sprachautomatisierungstool


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.

So verwenden Sie

  • Spezielle Kommentare hinzufügen
//go:generate command argument...
Nach dem Login kopieren
  • Führen Sie den Generierungsbefehl aus
$ go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
Nach dem Login kopieren

Notizen

  • Dieser besondere Kommentar muss in der . enthalten sein. Gehen Sie zur Mitte der Quellcodedatei.
  • Jede Quellcodedatei kann mehrere spezielle Kommentare generieren.
  • go generic wird nicht durch Befehle wie go build, go get, go test usw. ausgelöst und muss vom Entwickler explizit verwendet werden.
  • Die Befehlsausführung erfolgt seriell. Wenn ein Fehler auftritt, werden nachfolgende Befehle nicht ausgeführt.
  • Spezielle Kommentare müssen mit „//go:generate“ beginnen, ohne Leerzeichen nach dem doppelten Schrägstrich.
  • Der Ausführungsbefehl muss ein ausführbares Programm unter dem Systempfad (echo $PATH) sein.

Anwendungsbeispiel

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!")}
Nach dem Login kopieren

Führen Sie den Befehl „go generic“ aus

$ go generate
GoGoGo!go rum main.go!amd64 darwin main.go 7 main
Nach dem Login kopieren

Implementieren Sie die String-Methode für Aufzählungskonstanten


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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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)}
Nach dem Login kopieren

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
Nach dem Login kopieren

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]]}
Nach dem Login kopieren

Auf diese Weise müssen wir jedes Mal, wenn wir den Pill-Typ ändern, nur die folgende Anweisung ausführen.

$ go generate
Nach dem Login kopieren

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.

Welche Funktion hat der Go-Generate-Befehl?

Zusammenfassung


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.

Welche Funktion hat der Go-Generate-Befehl?

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie kann ich Dateien mit Golang sicher lesen und schreiben? Wie kann ich Dateien mit Golang sicher lesen und schreiben? Jun 06, 2024 pm 05:14 PM

Das sichere Lesen und Schreiben von Dateien in Go ist von entscheidender Bedeutung. Zu den Richtlinien gehören: Überprüfen von Dateiberechtigungen, Schließen von Dateien mithilfe von Verzögerungen, Validieren von Dateipfaden, Verwenden von Kontext-Timeouts. Das Befolgen dieser Richtlinien gewährleistet die Sicherheit Ihrer Daten und die Robustheit Ihrer Anwendungen.

Wie konfiguriere ich den Verbindungspool für die Golang-Datenbankverbindung? Wie konfiguriere ich den Verbindungspool für die Golang-Datenbankverbindung? Jun 06, 2024 am 11:21 AM

Wie konfiguriere ich Verbindungspooling für Go-Datenbankverbindungen? Verwenden Sie den DB-Typ im Datenbank-/SQL-Paket, um eine Datenbankverbindung zu erstellen. Legen Sie MaxOpenConns fest, um die maximale Anzahl gleichzeitiger Verbindungen festzulegen. Legen Sie ConnMaxLifetime fest, um den maximalen Lebenszyklus der Verbindung festzulegen.

Ähnlichkeiten und Unterschiede zwischen Golang und C++ Ähnlichkeiten und Unterschiede zwischen Golang und C++ Jun 05, 2024 pm 06:12 PM

Golang und C++ sind Garbage-Collected- bzw. manuelle Speicherverwaltungs-Programmiersprachen mit unterschiedlicher Syntax und Typsystemen. Golang implementiert die gleichzeitige Programmierung über Goroutine und C++ implementiert sie über Threads. Die Golang-Speicherverwaltung ist einfach und C++ bietet eine höhere Leistung. In der Praxis ist Golang-Code prägnanter und C++ bietet offensichtliche Leistungsvorteile.

Wie steil ist die Lernkurve der Golang-Framework-Architektur? Wie steil ist die Lernkurve der Golang-Framework-Architektur? Jun 05, 2024 pm 06:59 PM

Die Lernkurve der Go-Framework-Architektur hängt von der Vertrautheit mit der Go-Sprache und der Backend-Entwicklung sowie der Komplexität des gewählten Frameworks ab: einem guten Verständnis der Grundlagen der Go-Sprache. Es ist hilfreich, Erfahrung in der Backend-Entwicklung zu haben. Frameworks mit unterschiedlicher Komplexität führen zu unterschiedlichen Lernkurven.

Wie generiere ich zufällige Elemente aus einer Liste in Golang? Wie generiere ich zufällige Elemente aus einer Liste in Golang? Jun 05, 2024 pm 04:28 PM

So generieren Sie zufällige Elemente einer Liste in Golang: Verwenden Sie rand.Intn(len(list)), um eine zufällige Ganzzahl innerhalb des Längenbereichs der Liste zu generieren. Verwenden Sie die Ganzzahl als Index, um das entsprechende Element aus der Liste abzurufen.

Vergleich der Vor- und Nachteile des Golang-Frameworks Vergleich der Vor- und Nachteile des Golang-Frameworks Jun 05, 2024 pm 09:32 PM

Das Go-Framework zeichnet sich durch seine hohen Leistungs- und Parallelitätsvorteile aus, weist jedoch auch einige Nachteile auf, z. B. dass es relativ neu ist, über ein kleines Entwickler-Ökosystem verfügt und einige Funktionen fehlen. Darüber hinaus können schnelle Änderungen und Lernkurven von Framework zu Framework unterschiedlich sein. Das Gin-Framework ist aufgrund seines effizienten Routings, der integrierten JSON-Unterstützung und der leistungsstarken Fehlerbehandlung eine beliebte Wahl für die Erstellung von RESTful-APIs.

Was sind die Best Practices für die Fehlerbehandlung im Golang-Framework? Was sind die Best Practices für die Fehlerbehandlung im Golang-Framework? Jun 05, 2024 pm 10:39 PM

Best Practices: Erstellen Sie benutzerdefinierte Fehler mit klar definierten Fehlertypen (Fehlerpaket). Stellen Sie weitere Details bereit. Protokollieren Sie Fehler ordnungsgemäß. Geben Sie Fehler korrekt weiter und vermeiden Sie das Ausblenden oder Unterdrücken. Wrappen Sie Fehler nach Bedarf, um Kontext hinzuzufügen

Was sind die Vorteile des Golang-Frameworks? Was sind die Vorteile des Golang-Frameworks? Jun 06, 2024 am 10:26 AM

Vorteile des Golang Frameworks Golang ist eine leistungsstarke, nebenläufige Programmiersprache, die sich besonders für Microservices und verteilte Systeme eignet. Das Golang-Framework erleichtert die Entwicklung dieser Anwendungen, indem es eine Reihe vorgefertigter Komponenten und Tools bereitstellt. Hier sind einige der wichtigsten Vorteile des Golang-Frameworks: 1. Hohe Leistung und Parallelität: Golang selbst ist für seine hohe Leistung und Parallelität bekannt. Es verwendet Goroutinen, einen einfachen Threading-Mechanismus, der die gleichzeitige Ausführung von Code ermöglicht und dadurch den Anwendungsdurchsatz und die Reaktionsfähigkeit verbessert. 2. Modularität und Wiederverwendbarkeit: Das Golang-Framework fördert Modularität und wiederverwendbaren Code. Durch die Aufteilung der Anwendung in unabhängige Module können Sie den Code einfach verwalten und aktualisieren

See all articles