Gibt es eine einfache Möglichkeit, eine Zeichenfolge in Go zu formatieren, ohne die Zeichenfolge zu drucken?
Ich kann:
bar := "bar"
fmt.Printf("foo: %s", bar)
Ich möchte jedoch, dass die formatierte Zeichenfolge zurückgegeben und nicht gedruckt wird, damit ich sie weiter bearbeiten kann.
Ich könnte auch so etwas machen wie:
s := "foo: " + bar
Dies ist jedoch schwierig zu lesen, wenn die Formatzeichenfolge komplex ist, und umständlich, wenn einer oder mehrere der Teile keine Zeichenfolgen sind und zuerst konvertiert werden müssen, wie z
i := 25
s := "foo: " + strconv.Itoa(i)
Gibt es einen einfacheren Weg, dies zu tun?
string
go
formatting
string-formatting
Carnegie
quelle
quelle
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 StartbuchstabenS
, aber dieseSxxx()
Varianten geben das Ergebnis als a zurück,string
anstatt sie an die Standardausgabe zu drucken.Zum Beispiel:
Die Variable
s
wird mit dem Wert initialisiert: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:Wenn Sie nur
string
s verketten möchten, können Sie auchstrings.Join()
ein benutzerdefiniertes Trennzeichen angebenstring
(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ügunghtml/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 Pakettext/template
und sollte anstelle dertext/template
HTML-Ausgabe verwendet werden.Für die Verwendung der
template
Pakete müssen Sie grundsätzlich eine statische Vorlage in Form einesstring
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 undmap
Werte, die verschachtelt sein können.Beispiel:
Angenommen, Sie möchten E-Mail-Nachrichten generieren, die folgendermaßen aussehen:
Um solche E-Mail-Nachrichtentexte zu generieren, können Sie die folgende statische Vorlage verwenden:
Und stellen Sie Daten wie diese zur Ausführung bereit:
Normalerweise wird die Ausgabe von Vorlagen in a geschrieben.
io.Writer
Wenn Sie also das Ergebnis als a möchtenstring
, erstellen und schreiben Sie in abytes.Buffer
(das implementiertio.Writer
). Ausführen der Vorlage und Abrufen des Ergebnisses wie folgtstring
:Dies führt zu der erwarteten Ausgabe:
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: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 wirdio.Writer
):Dadurch wird das Ergebnis direkt in geschrieben
os.Stdout
. Versuchen Sie dies auf dem Go-Spielplatz .quelle
In Ihrem Fall müssen Sie Sprintf () für die Formatzeichenfolge verwenden.
func Sprintf(format string, a ...interface{}) string
Sprintf formatiert gemäß einem Formatbezeichner und gibt die resultierende Zeichenfolge zurück.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Ihre Ausgabe wird sein:
quelle
Die Funktion fmt.SprintF gibt eine Zeichenfolge zurück, und Sie können die Zeichenfolge genauso formatieren, wie Sie es mit fmt.PrintF tun würden
quelle
Wir können einen neuen String-Typ über
define new Type
mitFormat
Unterstützung anpassen.quelle