Ce face text/template.Template.Funcs
t.Funcs(template.FuncMap{"lei": formatLei}) face ca funcția formatLei să poată fi apelată în șablon cu numele lei: {{lei .Total}} sau, cu pipe, {{.Total | lei}}. Funcțiile trebuie să returneze o valoare sau o valoare și o error; dacă eroarea nu este nil, execuția se oprește.
Ordinea contează: Funcs se apelează înainte de Parse, pentru că la parsare Go verifică dacă fiecare funcție folosită există. De aceea se scrie de obicei în lanț: template.New("x").Funcs(fm).Parse(text). Funcțiile predefinite (len, printf, index, and, or, not, eq…) există mereu.
Parametri
| Parametru | Descriere |
|---|---|
funcMap |
Map de la numele folosit în șablon la funcția Go. |
Ce returnează
Același șablon, ca să poți continua lanțul.
Exemple
Exemplul 1: Funcții pentru formatare
package main
import (
"fmt"
"os"
"strings"
"text/template"
"time"
)
func main() {
functii := template.FuncMap{
"lei": func(v float64) string { return strings.Replace(fmt.Sprintf("%.2f lei", v), ".", ",", 1) },
"data": func(t time.Time) string { return t.Format("02.01.2006") },
"mari": strings.ToUpper,
"plus1": func(i int) int { return i + 1 },
}
t := template.Must(template.New("raport").Funcs(functii).Parse(
`RAPORT {{.Titlu | mari}} - {{data .Ziua}}
{{range $i, $p := .Produse}}{{plus1 $i}}. {{$p.Nume}}: {{lei $p.Pret}}
{{end}}`))
date := map[string]any{
"Titlu": "vânzări",
"Ziua": time.Date(2026, 10, 19, 0, 0, 0, 0, time.UTC),
"Produse": []struct {
Nume string
Pret float64
}{{"cafea", 32.5}, {"ceai", 14}},
}
if err := t.Execute(os.Stdout, date); err != nil {
fmt.Println(err)
}
}
Rezultat
RAPORT VÂNZĂRI - 19.10.2026
1. cafea: 32,50 lei
2. ceai: 14,00 lei
Exemplul 2: Funcție care returnează eroare și Funcs după Parse
package main
import (
"errors"
"fmt"
"os"
"text/template"
)
func main() {
imparte := func(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("împărțire la zero")
}
return a / b, nil
}
t := template.Must(template.New("m").Funcs(template.FuncMap{"imparte": imparte}).Parse(
"Pe persoană: {{imparte .Total .Persoane}} lei\n"))
t.Execute(os.Stdout, map[string]int{"Total": 300, "Persoane": 4})
err := t.Execute(os.Stdout, map[string]int{"Total": 300, "Persoane": 0})
fmt.Println("\nEroare:", err)
_, err = template.New("x").Parse("{{lei 5}}")
fmt.Println("Fără Funcs:", err)
}
Rezultat
Pe persoană: 75 lei
Pe persoană:
Eroare: template: m:1:16: executing "m" at <imparte .Total .Persoane>: error calling imparte: împărțire la zero
Fără Funcs: template: x:1: function "lei" not defined
Greșeli frecvente
- Apelezi
FuncsdupăParse: parsarea dă eroareafunction "lei" not defined. - Pui în
FuncMapfuncții cu trei rezultate sau care returnează o eroare pe prima poziție:Funcsse oprește cu panică.
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.Template.Execute: Completează șablonul cu datele date și scrie rezultatul într-un io.Writer (ecran, fișier, răspuns HTTP, buffer).html/template.Template: Șabloane pentru HTML, cu aceeași interfață ca text/template, care codează automat datele după context (protecție XSS).