7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Go

Texterstellung mit Go-Vorlagen

Scroll to top
Read Time: 8 mins

German (Deutsch) translation by Eva (you can also view the original English article)

Übersicht

Text ist überall um uns herum als Software-Entwickler. Code ist Text, HTML ist Text, XNL/JSON/YAML/TOML ist Text, Markdown ist Text, CSV ist Text. Alle diese Textformate sind für Mensch und Maschine konzipiert. Menschen sollten in der Lage sein, Textformate mit Klartexteditoren zu lesen und zu bearbeiten.

Aber es gibt viele Fälle, in denen Sie Text in einem bestimmten Format generieren müssen. Sie können von einem Format in ein anderes konvertieren, Ihre eigene DSL erstellen, automatisch Hilfscode generieren oder einfach eine E-Mail mit benutzerspezifischen Informationen anpassen. Was auch immer die Notwendigkeit ist, Go ist mehr als nur in der Lage, Ihnen auf dem Weg mit seinen leistungsstarken Vorlagen zu helfen.

In diesem Tutorial erfahren Sie mehr über die Ins und Outs von Go-Vorlagen und wie Sie sie für leistungsstarke Textgenerierung verwenden können.

Was sind Go-Vorlagen?

Go-Vorlagen sind Objekte, die Text mit speziellen Platzhaltern verwalten, die als Aktionen bezeichnet werden und in doppelte geschweifte Klammern eingeschlossen sind: {{some action}}. Wenn Sie die Vorlage ausführen, stellen Sie ihr eine Go-Struktur zur Verfügung, die die Daten enthält, die die Platzhalter benötigen.

Hier ist ein kurzes Beispiel, das Klopf-Witze erzeugt. Ein Klopf-Witz hat ein sehr strenges Format. Die einzigen Dinge, die sich ändern, sind die Identität des Klopfers und die Pointe.

Grundlegendes zu Vorlagenaktionen

Die Vorlagensyntax ist sehr leistungsfähig und unterstützt Aktionen wie Datenaccessoren, Funktionen, Pipelines, Variablen, Conditionale und Schleifen.

Datenzubehör

Datenzubehör ist sehr einfach. Sie ziehen einfach Daten aus dem Strukturstart. Sie können auch in verschachtelten Strukturen suchen:

Wenn die Daten keine Struktur sind, können Sie nur {{.}} verwenden, um direkt auf den Wert zuzugreifen:

Wir werden später sehen, wie mit Arrays, Slices und Karten umzugehen ist.

Funktionen

Die Funktionen können Sie mit den Vorlagen wirklich erhöhen. Es gibt viele globale Funktionen, und Sie können sogar vorlagenspezifische Funktionen hinzufügen. Die vollständige Liste der globalen Funktionen finden Sie auf der Go-Website.

Hier ist ein Beispiel für die Verwendung der printf-Funktion in einer Vorlage:

Pipelines

Mit Pipelines können Sie mehrere Funktionen auf den aktuellen Wert anwenden. Durch das Kombinieren verschiedener Funktionen wird die Art und Weise, wie Sie Ihre Werte schneiden und mischen können, erheblich erweitert.

Im folgenden Code verkette ich drei Funktionen. Zuerst führt die Aufruffunktion das Funktionsübergeben an Execute(). Dann gibt die len-Funktion die Länge des Ergebnisses der Eingabefunktion zurück, die in diesem Fall 3 ist. Schließlich druckt die printf-Funktion die Anzahl der Elemente.

Variablen

Manchmal möchten Sie das Ergebnis einer komplexen Pipeline mehrmals wiederverwenden. Mit Go-Vorlagen können Sie eine Variable definieren und so oft wiederverwenden, wie Sie möchten. Im folgenden Beispiel werden Vor- und Nachname aus der Eingabestruktur extrahiert, in Anführungszeichen gesetzt und in den Variablen $F und $L gespeichert. Dann werden sie in normaler und umgekehrter Reihenfolge gerendert.

Ein weiterer netter Trick besteht darin, dass ich der Vorlage eine anonyme Struktur übergebe, um den Code präziser zu gestalten und zu vermeiden, dass er mit Typen überfüllt wird, die nur an einer Stelle verwendet werden.

Bedingungen

Aber lassen Sie uns hier nicht aufhören. Sie können sogar Bedingungen in Ihren Vorlagen haben. Es gibt eine if-end-Aktion und eine if-else-end-Aktion. Die if-Klausel wird angezeigt, wenn die Ausgabe der bedingten Pipeline nicht leer ist:

Beachten Sie, dass die else-Klausel eine neue Zeile verursacht und der Text "Keine Daten verfügbar" erheblich eingerückt ist.

Schleifen

Go-Vorlagen haben auch Schleifen. Dies ist sehr nützlich, wenn Ihre Daten Slices, Maps oder andere wiederholbare Elemente enthalten. Das Datenobjekt für eine Schleife kann ein beliebiges wiederholbares Go-Objekt wie Array, Slice, Map oder Channel sein. Mit der Bereichsfunktion können Sie das Datenobjekt durchlaufen und für jedes Element eine Ausgabe erstellen. Mal sehen, wie man einen Plan erstellt:

Wie Sie sehen können, ist das führende Leerzeichen immer noch ein Problem. Ich konnte keinen vernünftigen Weg finden, dies innerhalb der Vorlagensyntax zu beheben. Es wird eine Nachbearbeitung erforderlich sein. Theoretisch können Sie einen Bindestrich platzieren, um Leerzeichen vor oder nach Aktionen zu kürzen. Dies funktioniert jedoch nicht, wenn eine range vorhanden ist.

Textvorlagen

Textvorlagen sind im text/template-Paket implementiert. Zusätzlich zu allem, was wir bisher gesehen haben, kann dieses Paket auch Vorlagen aus Dateien laden und mithilfe der Vorlagenaktion mehrere Vorlagen erstellen. Das Template-Objekt selbst verfügt über viele Methoden, um solche erweiterten Anwendungsfälle zu unterstützen:

  • Dateianalyse()
  • Globalanalyse()
  • Analysebaum hinzufügen()
  • Klonen()
  • Vorlagendefinierung()
  • Delims()
  • Vorlagenausführung()
  • Funktionen()
  • Nachsehen()
  • Optionen()
  • Vorlagen()

Aus Platzgründen werde ich nicht näher darauf eingehen (möglicherweise in einem anderen Tutorial).

HTML-Vorlagen

HTML-Vorlagen werden im HTML/Template-Paket definiert. Es hat genau die gleiche Oberfläche wie das Textvorlagenpaket, wurde jedoch entwickelt, um HTML zu generieren, das vor Code-Injection sicher ist. Dazu werden die Daten sorgfältig bereinigt, bevor sie in die Vorlage eingebettet werden. Die vorrausgesetzte Annahme ist, dass Vorlagenautoren vertrauenswürdig sind, die für die Vorlage bereitgestellten Daten jedoch nicht vertrauenswürdig sind.

Das ist wichtig. Wenn Sie Vorlagen, die Sie von nicht vertrauenswürdigen Quellen erhalten, automatisch anwenden, schützt Sie das HTML / Vorlagen-Paket nicht. Es liegt in Ihrer Verantwortung, die Vorlagen zu überprüfen.

Lassen Sie uns den Unterschied zwischen der Ausgabe von text/template und html/template darstellen. Bei Verwendung von text/template ist es einfach JavaScript-Code in die generierte Ausgabe einzufügen.

Das Importieren von html/template anstelle von text/template verhindert diesen Angriff jedoch, indem die Skript-Tags und die Klammern maskiert werden:

Umgang mit Fehlern

Es gibt zwei Arten von Fehlern: Analysefehler und Ausführungsfehler. Die Funktion Parse() analysiert den Vorlagentext und gibt einen Fehler zurück, den ich in den Codebeispielen ignoriert habe. In der Erzeugung des Codes möchten Sie diese Fehler jedoch frühzeitig erkennen und beheben.

Wenn Sie eine schnelle und unkomplizierte Ausgabe wünschen, übernimmt die Must() -Methode die Ausgabe in einer Methode, der (*Template,error) zurückgibt - wie Clone(), Parse() oder ParseFiles() - und alarmiert, wenn der Fehler nicht auf Null ist. So überprüfen Sie, ob ein expliziter Analysefehler vorliegt:

Wenn Sie Must() verwenden, werden sie alarmiert, wenn etwas mit der Vorlage nicht stimmt:

Die andere Art von Fehler ist ein Ausführungsfehler, wenn die bereitgestellten Daten nicht mit der Vorlage übereinstimmen. Auch hier können Sie explizit überprüfen oder Must() verwenden, um alarmiert zu werden. Ich empfehle in diesem Fall, dass Sie überprüfen und einen Wiederherstellungsmechanismus einrichten.

Normalerweise muss das gesamte System nicht heruntergefahren werden, nur weil eine Eingabe nicht den Anforderungen entspricht. Im folgenden Beispiel erwartet die Vorlage ein Feld mit dem Namen Name in der Datenstruktur, aber ich stelle der Struktur ein Feld mit dem Namen FullName zur Verfügung.

Schlussfolgerung

Go verfügt über ein leistungsstarkes und ausgeklügeltes Vorlagen-System. Es wird in vielen großen Projekten wie Kubernetes und Hugo mit großem Erfolg eingesetzt. Das html/template-Paket bietet eine sichere, industrietaugliche Einrichtung, um die Ausgabe von webbasierten Systemen zu bereinigen. In diesem Tutorial haben wir alle Grundlagen und einige Zwischenanwendungsfälle behandelt.

Die Vorlagenpakete enthalten noch erweiterte Funktionen, die darauf warten, entdeckt zu werden. Spielen Sie mit Vorlagen und integrieren Sie sie in Ihre Programme. Sie werden angenehm überrascht sein, wie präzise und lesbar Ihr Textgenerierungscode aussieht.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.