Formatați un șir Go fără a imprima?

iun. 28, 2021
admin

Șiruri de caractere simple

Pentru șirurile „simple” (de obicei ceea ce încape într-o linie) cea mai simplă soluție este folosirea lui fmt.Sprintf() și a prietenilor (fmt.Sprint(), fmt.Sprintln()). Acestea sunt analoge funcțiilor fără litera de început S, dar aceste variante Sxxx() returnează rezultatul sub forma unui string în loc să le tipărească pe ieșirea standard.

De exemplu:

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

Variabila s va fi inițializată cu valoarea:

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

Sugestie: Dacă doriți doar să concatenați valori de tipuri diferite, este posibil să nu fie nevoie să folosiți automat Sprintf() (care necesită un șir de format), deoarece Sprint() face exact acest lucru. Vedeți acest exemplu:

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

Pentru a concatena doar strings, puteți folosi, de asemenea, strings.Join() unde puteți specifica un separator personalizat string (care să fie plasat între șirurile de unit).

Încercați acestea pe Go Playground.

Șiruri complexe (documente)

Dacă șirul pe care încercați să îl creați este mai complex (de exemplu, un mesaj de e-mail cu mai multe linii), fmt.Sprintf() devine mai puțin lizibil și mai puțin eficient (mai ales dacă trebuie să faceți acest lucru de mai multe ori).

Pentru aceasta, biblioteca standard oferă pachetele text/template și html/template. Aceste pachete implementează șabloane bazate pe date pentru generarea de ieșire textuală. html/template este pentru generarea de ieșiri HTML sigure împotriva injecției de cod. Acesta oferă aceeași interfață ca și pachetul text/template și ar trebui utilizat în locul lui text/template ori de câte ori ieșirea este HTML.

Utilizarea pachetelor template presupune, în principiu, să furnizați un șablon static sub forma unei valori string (care poate proveni dintr-un fișier, caz în care se furnizează doar numele fișierului) care poate conține text static și acțiuni care sunt procesate și executate atunci când motorul procesează șablonul și generează ieșirea.

Se pot furniza parametri care sunt incluși/substituiți în șablonul static și care pot controla procesul de generare a ieșirii. Forma tipică a unor astfel de parametri sunt structs și map valori care pot fi imbricate.

Exemplu:

De exemplu, să spunem că doriți să generați mesaje de e-mail care să arate astfel:

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

Pentru a genera corpuri de mesaje de e-mail ca acesta, ați putea utiliza următorul șablon static:

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

Și să furnizați date ca acestea pentru a-l executa:

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

În mod normal, rezultatele șabloanelor sunt scrise într-un io.Writer, deci, dacă doriți ca rezultatul să fie un string, creați și scrieți într-un bytes.Buffer (care implementează io.Writer). Executați șablonul și obțineți rezultatul ca 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()

Aceasta va duce la ieșirea așteptată:

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

Încercați-o pe Go Playground.

Rețineți, de asemenea, că începând cu Go 1.10, este disponibilă o alternativă mai nouă, mai rapidă și mai specializată la bytes.Buffer, care este: strings.Builder. Utilizarea este foarte asemănătoare:

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

Încercați-o pe aceasta pe Go Playground.

Rețineți: puteți, de asemenea, să afișați rezultatul execuției unui șablon dacă furnizați os.Stdout ca țintă (care implementează, de asemenea, io.Writer):

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

Aceasta va scrie rezultatul direct în os.Stdout. Încercați acest lucru pe Go Playground.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.