text/template.Template.Execute în Go

Completează șablonul cu datele date și scrie rezultatul într-un io.Writer (ecran, fișier, răspuns HTTP, buffer).

Sintaxă
func (t *Template) Execute(wr io.Writer, data any) error

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-un bytes.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).