Go karakterlánc formázása nyomtatás nélkül?

jún 28, 2021
admin

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 structs é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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.