Go karakterlánc formázása nyomtatás nélkül?
Egyszerű karakterláncok
Az “egyszerű” karakterláncok (jellemzően ami egy sorba belefér) esetében a legegyszerűbb megoldás a fmt.Sprintf()
és társai (fmt.Sprint()
, fmt.Sprintln()
) használata. Ezek analógok a S
kezdőbetű nélküli függvényekkel, de ezek a Sxxx()
változatok string
-ként adják vissza az eredményt ahelyett, hogy a standard kimenetre nyomtatnák.
Példa:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
A s
változót a következő értékkel inicializáljuk:
Hi, my name is Bob and I'm 23 years old.
Tipp: Ha csak különböző típusú értékeket akarunk összekapcsolni, nem biztos, hogy automatikusan szükségünk van a Sprintf()
használatára (amely formázó karakterláncot igényel), mivel a Sprint()
pontosan ezt teszi. Lásd ezt a példát:
i := 23s := fmt.Sprint("") // s will be ""
A csak string
-ek összekapcsolásához használhatod a strings.Join()
-t is, ahol megadhatsz egy egyéni elválasztót string
(amelyet az összekapcsolandó karakterláncok közé kell helyezni).
Kipróbáld ezeket a Go Playgroundon.
Bonyolult karakterláncok (dokumentumok)
Ha a létrehozni kívánt karakterlánc bonyolultabb (pl. egy többsoros e-mail üzenet), a fmt.Sprintf()
kevésbé lesz olvasható és kevésbé hatékony (különösen, ha ezt sokszor kell megtenni).
Ezekre a szabványos könyvtár biztosítja a text/template
és html/template
csomagokat. Ezek a csomagok adatvezérelt sablonokat valósítanak meg a szöveges kimenet létrehozásához. A html/template
a kódbefecskendezéssel szemben biztonságos HTML kimenet generálására szolgál. Ugyanazt az interfészt biztosítja, mint a text/template
csomag, és a text/template
helyett kell használni, ha a kimenet HTML.
A template
csomagok használata alapvetően megköveteli, hogy megadjunk egy statikus sablont egy string
érték formájában (amely származhat egy fájlból, ebben az esetben csak a fájl nevét kell megadni), amely tartalmazhat statikus szöveget, és műveleteket, amelyeket a motor feldolgoz és végrehajt, amikor feldolgozza a sablont és létrehozza a kimenetet.
Megadhat olyan paramétereket, amelyek a statikus sablonban szerepelnek/helyettesíthetők, és amelyek vezérelhetik a kimeneti generálási folyamatot. Az ilyen paraméterek tipikus formája a struct
s és map
értékek, amelyek egymásba ágyazhatók.
Példa:
Tegyük fel például, hogy olyan e-mail üzeneteket szeretne generálni, amelyek így néznek ki:
Hi !Your account is ready, your user name is: You have the following roles assigned:, , ...
Az ilyen e-mail üzenettestek generálásához a következő statikus sablont használhatja:
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}}`
És ilyen adatokat adjon meg a végrehajtásához:
data := mapinterface{}{ "Name": "Bob", "UserName": "bob92", "Roles": string{"dbteam", "uiteam", "tester"},}
A sablonok kimenete általában egy io.Writer
-be íródik, így ha az eredményt string
-ként szeretné látni, hozzon létre és írjon egy bytes.Buffer
-ba (amely megvalósítja a io.Writer
-t). Ha végrehajtjuk a sablont és az eredményt string
-ként kapjuk:
t := template.Must(template.New("email").Parse(emailTmpl))buf := &bytes.Buffer{}if err := t.Execute(buf, data); err != nil { panic(err)}s := buf.String()
Ez a várt kimenetet fogja eredményezni:
Hi Bob!Your account is ready, your user name is: bob92You have the following roles assigned:dbteam, uiteam, tester
Kipróbáljuk a Go Playgroundon.
Megjegyezzük továbbá, hogy a Go 1.10 óta a bytes.Buffer
-nak van egy újabb, gyorsabb, speciálisabb alternatívája, ami a következő: strings.Builder
. A használat nagyon hasonló:
builder := &strings.Builder{}if err := t.Execute(builder, data); err != nil { panic(err)}s := builder.String()
Kipróbáld ezt a Go Playgroundon.
Figyelem: a sablon végrehajtás eredményét is megjelenítheted, ha célként a os.Stdout
-t adod meg (ami szintén a io.Writer
-t implementálja):
t := template.Must(template.New("email").Parse(emailTmpl))if err := t.Execute(os.Stdout, data); err != nil { panic(err)}
Ez az eredményt közvetlenül a os.Stdout
-be írja. Próbáld ki ezt a Go játszótéren.