Ce face text/template.Template.Execute
t.Execute(w, date) parcurge șablonul și scrie rezultatul în w, înlocuind fiecare acțiune {{...}} cu valorile din date. Datele pot fi o structură, un map ({{.cheie}}), un slice sau o valoare simplă. Pentru rezultat ca text, scrie într-un strings.Builder sau bytes.Buffer.
Același șablon parsat se poate executa de oricâte ori, cu date diferite, și din mai multe goroutine în paralel. Erorile de execuție (câmp inexistent, funcție care returnează eroare) opresc scrierea, dar ce s-a scris până atunci rămâne în w; de aceea, pentru răspunsuri HTTP, execută întâi într-un buffer și trimite doar dacă nu a fost eroare.
Pentru un map, o cheie lipsă afișează implicit <no value>; cu t.Option("missingkey=error") devine eroare.
Parametri
| Parametru | Descriere |
|---|---|
wr |
Destinația (io.Writer). |
data |
Datele pentru șablon (punctul . de la început). |
Ce returnează
nil sau eroarea de execuție.
Exemple
Exemplul 1: Același șablon, date diferite, rezultat în text
package main
import (
"fmt"
"strings"
"text/template"
)
func main() {
t := template.Must(template.New("nota").Parse(
`{{.Elev}}: {{.Nota}} - {{if ge .Nota 5}}promovat{{else}}corigent{{end}}{{with .Observatii}} ({{.}}){{end}}`))
elevi := []map[string]any{
{"Elev": "Ana", "Nota": 10, "Observatii": "olimpică"},
{"Elev": "Radu", "Nota": 4, "Observatii": ""},
{"Elev": "Ioana", "Nota": 7},
}
for _, e := range elevi {
var sb strings.Builder
if err := t.Execute(&sb, e); err != nil {
fmt.Println("eroare:", err)
continue
}
fmt.Println(sb.String())
}
}
Rezultat
Ana: 10 - promovat (olimpică)
Radu: 4 - corigent
Ioana: 7 - promovat
Exemplul 2: Chei lipsă și erori de execuție
O cheie lipsă dintr-un map apare implicit ca <no value>. La eroare, textul de dinaintea acțiunii greșite („Oraș: ”, „Salut, ”) a fost deja scris.
package main
import (
"fmt"
"os"
"text/template"
)
type Client struct{ Nume string }
func main() {
t := template.Must(template.New("m").Parse("Oraș: {{.oras}}\n"))
t.Execute(os.Stdout, map[string]string{"nume": "Ana"})
strict := template.Must(template.New("m").Option("missingkey=error").Parse("Oraș: {{.oras}}\n"))
err := strict.Execute(os.Stdout, map[string]string{"nume": "Ana"})
fmt.Println("\nEroare:", err)
t2 := template.Must(template.New("c").Parse("Salut, {{.Prenume}}!\n"))
err = t2.Execute(os.Stdout, Client{"Ana"})
fmt.Println("\nEroare:", err)
}
Rezultat
Oraș: <no value>
Oraș:
Eroare: template: m:1:9: executing "m" at <.oras>: map has no entry for key "oras"
Salut,
Eroare: template: c:1:9: executing "c" at <.Prenume>: can't evaluate field Prenume in type main.Client
Greșeli frecvente
- Execuți direct în
http.ResponseWriterși apare o eroare la jumătate: clientul primește o pagină tăiată cu cod 200. Execută într-unbytes.Buffer, verifică eroarea, apoi trimite. - Parsezi șablonul la fiecare cerere: este lent. Parsează-l o dată, la pornire, și refolosește-l.
Comenzi înrudite
text/template.New: Creează un șablon text cu un nume; Parse îi încarcă textul cu acțiuni {{…}} care vor fi completate din date.text/template.Must: Primește rezultatul lui Parse (șablon, eroare) și oprește programul cu panică dacă există eroare; pentru șabloane fixe.text/template.Template.ExecuteTemplate: Execută din set șablonul cu numele dat (definit cu {{define}} sau încărcat dintr-un fișier).html/template.Template: Șabloane pentru HTML, cu aceeași interfață ca text/template, care codează automat datele după context (protecție XSS).