1. Einfache Zeichenfolgen
Für "einfache" Zeichenfolgen (normalerweise das, was in eine Zeile passt) ist die einfachste Lösung die Verwendung von fmt.Sprintf()
und friends ( fmt.Sprint()
, fmt.Sprintln()
). Diese sind analog zu den Funktionen ohne Startbuchstaben S
, aber diese Sxxx()
Varianten geben das Ergebnis als a zurück, string
anstatt sie an die Standardausgabe zu drucken.
Zum Beispiel:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
Die Variable s
wird mit dem Wert initialisiert:
Hi, my name is Bob and I'm 23 years old.
Tipp: Wenn Sie nur Werte verschiedener Typen verketten möchten, müssen Sie diese möglicherweise nicht automatisch verwenden Sprintf()
(für die eine Formatzeichenfolge erforderlich ist) Sprint()
. Siehe dieses Beispiel:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
Wenn Sie nur string
s verketten möchten, können Sie auch strings.Join()
ein benutzerdefiniertes Trennzeichen angeben string
(das zwischen den zu verbindenden Zeichenfolgen platziert werden soll).
Probieren Sie diese auf dem Go Playground aus .
2. Komplexe Zeichenfolgen (Dokumente)
Wenn die Zeichenfolge, die Sie erstellen möchten, komplexer ist (z. B. eine mehrzeilige E-Mail-Nachricht), fmt.Sprintf()
wird sie weniger lesbar und weniger effizient (insbesondere, wenn Sie dies häufig tun müssen).
Hierzu stellt die Standardbibliothek die Pakete text/template
und zur Verfügung html/template
. Diese Pakete implementieren datengesteuerte Vorlagen zum Generieren von Textausgaben. html/template
dient zum Generieren einer HTML-Ausgabe, die gegen Code-Injection geschützt ist. Es bietet dieselbe Schnittstelle wie das Paket text/template
und sollte anstelle der text/template
HTML-Ausgabe verwendet werden.
Für die Verwendung der template
Pakete müssen Sie grundsätzlich eine statische Vorlage in Form eines string
Werts (der möglicherweise aus einer Datei stammt, in diesem Fall geben Sie nur den Dateinamen an) bereitstellen, der statischen Text enthalten kann, sowie Aktionen, die verarbeitet und ausgeführt werden, wenn die Die Engine verarbeitet die Vorlage und generiert die Ausgabe.
Sie können Parameter angeben, die in der statischen Vorlage enthalten / ersetzt sind und die den Prozess der Ausgabegenerierung steuern können. Typische Form solcher Parameter sind struct
s und map
Werte, die verschachtelt sein können.
Beispiel:
Angenommen, Sie möchten E-Mail-Nachrichten generieren, die folgendermaßen aussehen:
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
Um solche E-Mail-Nachrichtentexte zu generieren, können Sie die folgende statische Vorlage verwenden:
const emailTmpl = `Hi {{.Name}}!
Your account is ready, your user name is: {{.UserName}}
You have the following roles assigned:
{{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}
`
Und stellen Sie Daten wie diese zur Ausführung bereit:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
Normalerweise wird die Ausgabe von Vorlagen in a geschrieben. io.Writer
Wenn Sie also das Ergebnis als a möchten string
, erstellen und schreiben Sie in a bytes.Buffer
(das implementiert io.Writer
). Ausführen der Vorlage und Abrufen des Ergebnisses wie folgt string
:
t := template.Must(template.New("email").Parse(emailTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
panic(err)
}
s := buf.String()
Dies führt zu der erwarteten Ausgabe:
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Probieren Sie es auf dem Go Playground aus .
Beachten Sie auch, dass seit Go 1.10 eine neuere, schnellere und spezialisiertere Alternative verfügbar bytes.Buffer
ist : strings.Builder
. Die Verwendung ist sehr ähnlich:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Probieren Sie diesen auf dem Go Playground aus .
Hinweis: Sie können auch das Ergebnis einer Vorlagenausführung anzeigen, wenn Sie os.Stdout
als Ziel angeben (das auch implementiert wird io.Writer
):
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
Dadurch wird das Ergebnis direkt in geschrieben os.Stdout
. Versuchen Sie dies auf dem Go-Spielplatz .