📐 Controllare gli spazi bianchi nei template Go: cicli annidati 🔗

Quando si lavora con il pacchetto text/template di Go, la formattazione di strutture dati annidate produce spesso righe vuote indesiderate. Poiché i template Go preservano tutti gli spazi bianchi — inclusi i caratteri di ritorno a capo utilizzati per formattare il codice stesso del template — i cicli standard generano un output pieno di righe superflue.

Ecco come risolvere il problema degli spazi bianchi utilizzando i marcatori di taglio (trim markers) dei template Go.

📑 Indice 🔗


⚠️ Il problema: gli a capo preservati 🔗

Supponiamo di voler formattare questa struttura dati annidata:

var data = map[string]map[string][]string{
	"1": {
		"1.1": {"1.1.1", "1.1.2", "1.1.3"},
	},
	"2": {
		"2.1": {"2.1.1", "2.1.2", "2.1.3"},
	},
}

Un modo naturale per scrivere il template consiste nell’usare i blocchi standard {{ range }}:

{{ range $name, $map := . }}
{{ $name }}:
  {{ range $name, $values := $map }}
  {{ $name }}:
    {{ range $value := $values }}
    {{ $value }}
    {{ end }}
  {{ end }}
{{ end }}

Poiché ogni ritorno a capo e spazio di indentazione nel template viene stampato esattamente come è scritto, l’output risulta disseminato di righe vuote:

1:
  
  1.1:
    
    1.1.1
    
    1.1.2
    
    1.1.3
    
  

2:
...

✂️ La soluzione: il marcatore di taglio (-) 🔗

Puoi istruire il motore di template di Go affinché consumi gli spazi bianchi adiacenti aggiungendo un segno meno (-) all’interno dei tag di azione:

Per correggere il nostro ciclo annidato, posizioniamo strategicamente il marcatore - in modo da eliminare i ritorni a capo di formattazione del template senza rimuovere l’indentazione desiderata:

{{- range $name, $map := . -}}
{{ $name }}:
  {{- range $name, $values := $map }}
  {{ $name }}:
    {{- range $value := $values }}
    {{ $value }}
    {{- end }}
  {{- end }}
{{ end -}}

Rimuovendo i ritorni a capo immediatamente successivi alle dichiarazioni range e ai blocchi end, otteniamo un output pulito e compatto:

1:
  1.1:
    1.1.1
    1.1.2
    1.1.3
2:
  2.1:
    2.1.1
    2.1.2
    2.1.3

💻 Esempio completo eseguibile 🔗

Puoi copiare ed eseguire questo codice per testare direttamente il comportamento.

package main

import (
	"fmt"
	"os"
	"text/template"
)

var data = map[string]map[string][]string{
	"1": {
		"1.1": {"1.1.1", "1.1.2", "1.1.3"},
	},
	"2": {
		"2.1": {"2.1.1", "2.1.2", "2.1.3"},
	},
}

func main() {
	const tpl = `
{{- range $name, $map := . -}}
{{ $name }}:
  {{- range $name, $values := $map }}
  {{ $name }}:
    {{- range $value := $values }}
    {{ $value }}
    {{- end }}
  {{- end }}
{{ end -}}
`
	fmt.Println("Output:")
	fmt.Println("'''")
	
	t := template.Must(template.New("nested").Parse(tpl))
	t.Execute(os.Stdout, data)
	
	fmt.Println("'''")
}

📚 Scarica il Mio Ebook Gratuito 🔗

Scarica l'edizione offline di Lo Stile di Vita di Kaue—una guida pratica per ottimizzare 🍏 Salute, 💰 Ricchezza, ❤️ Amore e 🧘 Significato.

Lo Stile di Vita di Kaue

Lo Stile di Vita di Kaue

📬 Iscriviti alla Mia Newsletter 🔗

Ricevi una notifica quando pubblico nuovi saggi, riassunti di libri e guide pratiche per vivere bene. Niente spam—annulla l'iscrizione in qualsiasi momento.


💬 Commenti e Discussione 🔗

Hai una domanda, una prospettiva o un suggerimento? Condividi i tuoi pensieri qui sotto. I commenti utilizzano GitHub Discussions (senza pubblicità e senza spam)—clicca su Accedi con GitHub qui sotto per commentare o reagire (creare un account GitHub gratuito richiede meno di un minuto).



Aggiornato il 11 ott 2026.

AVVERTENZA LEGALE: Il contenuto di questo sito ha scopo esclusivamente informativo ed educativo e non costituisce consulenza medica, psicologica, finanziaria, di investimento, fiscale o legale. Le idee, la selezione e le opinioni qui presentate sono esclusivamente mie e non rappresentano quelle del mio datore di lavoro. I riassunti di libri, conferenze e articoli sono commenti educativi indipendenti e rimangono proprietà intellettuale dei rispettivi autori. Strumenti di IA possono essere utilizzati per assistere nella revisione, formattazione e sintesi; sebbene venga compiuto ogni sforzo per garantire l'accuratezza, possono verificarsi errori. PRIVACY: Questo sito utilizza servizi di terze parti per l'iscrizione facoltativa alla newsletter (follow.it), i commenti (giscus / GitHub Discussions) e i contenuti multimediali incorporati (YouTube), che possono trattare gli indirizzi IP e i cookie dei visitatori in conformità con le rispettive informative sulla privacy.