text/template.Template.Funcs în Go

Adaugă funcții proprii pe care șablonul le poate apela ({{lei .Total}}); trebuie apelată înainte de Parse.

Sintaxă
type FuncMap map[string]any

func (t *Template) Funcs(funcMap FuncMap) *Template

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 Funcs după Parse: parsarea dă eroarea function "lei" not defined.
  • Pui în FuncMap funcții cu trei rezultate sau care returnează o eroare pe prima poziție: Funcs se 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).