Formátování řetězce Go bez tisku?

Čvn 28, 2021
admin

Jednoduché řetězce

Pro „jednoduché“ řetězce (typicky to, co se vejde na řádek) je nejjednodušším řešením použití fmt.Sprintf() a přátel (fmt.Sprint(), fmt.Sprintln()). Ty jsou analogické funkcím bez počátečního písmene S, ale tyto varianty Sxxx() vracejí výsledek jako string místo vypisování na standardní výstup.

Například:

s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)

Proměnná s bude inicializována hodnotou:

Hi, my name is Bob and I'm 23 years old.

Tip: Pokud chcete pouze spojovat hodnoty různých typů, nemusíte automaticky používat Sprintf() (která vyžaduje formátovací řetězec), protože Sprint() dělá přesně toto. Viz tento příklad:

i := 23s := fmt.Sprint("") // s will be ""

Pro spojování pouze string můžete také použít strings.Join(), kde můžete zadat vlastní oddělovač string (který se umístí mezi spojované řetězce).

Vyzkoušejte je na hřišti Go Playground.

Složitější řetězce (dokumenty)

Pokud je řetězec, který se snažíte vytvořit, složitější (např. víceřádková e-mailová zpráva), fmt.Sprintf() se stává méně čitelným a méně efektivním (zejména pokud to musíte dělat mnohokrát).

Pro tento účel standardní knihovna poskytuje balíčky text/template a html/template. Tyto balíčky implementují datově řízené šablony pro generování textového výstupu. Balíček html/template slouží ke generování výstupu HTML bezpečného proti vstřikování kódu. Poskytuje stejné rozhraní jako balíček text/template a měl by být použit místo text/template vždy, když je výstupem HTML.

Použití balíčků template v podstatě vyžaduje, abyste poskytli statickou šablonu ve formě hodnoty string (která může pocházet ze souboru, v takovém případě poskytnete pouze název souboru), která může obsahovat statický text, a akce, které jsou zpracovány a provedeny, když engine zpracovává šablonu a generuje výstup.

Můžete uvést parametry, které jsou obsaženy/zastoupeny ve statické šabloně a které mohou řídit proces generování výstupu. Typickou podobou takových parametrů jsou hodnoty structs a map, které mohou být vnořené.

Příklad:

Řekněme, že chcete generovat e-mailové zprávy, které vypadají takto:

Hi !Your account is ready, your user name is: You have the following roles assigned:, , ... 

Pro generování těl e-mailových zpráv v tomto tvaru můžete použít následující statickou šablonu:

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}}`

A pro její spuštění poskytněte data takto:

data := mapinterface{}{ "Name": "Bob", "UserName": "bob92", "Roles": string{"dbteam", "uiteam", "tester"},}

Obvykle se výstup šablon zapisuje do io.Writer, takže pokud chcete výsledek jako string, vytvořte a zapište do bytes.Buffer (který implementuje io.Writer). Spuštění šablony a získání výsledku jako 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()

Výsledkem bude očekávaný výstup:

Hi Bob!Your account is ready, your user name is: bob92You have the following roles assigned:dbteam, uiteam, tester

Vyzkoušejte to na hřišti Go Playground.

Také si všimněte, že od Go 1.10 je k dispozici novější, rychlejší a specializovanější alternativa k bytes.Buffer, kterou je: strings.Builder. Použití je velmi podobné:

builder := &strings.Builder{}if err := t.Execute(builder, data); err != nil { panic(err)}s := builder.String()

Tento zkuste na hřišti Go Playground.

Poznámka: výsledek provedení šablony můžete také zobrazit, pokud jako cíl uvedete os.Stdout (který také implementuje io.Writer):

t := template.Must(template.New("email").Parse(emailTmpl))if err := t.Execute(os.Stdout, data); err != nil { panic(err)}

Tento výsledek zapíše přímo do os.Stdout. Vyzkoušejte to na hřišti Go Playground.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.