Ao trabalhar com o pacote text/template do Go, formatar estruturas de dados aninhadas frequentemente resulta em linhas em branco indesejadas. Como os templates do Go preservam todos os espaços em branco — incluindo as quebras de linha usadas para formatar o próprio código do template —, loops padrão acabam gerando uma saída poluída.
Veja a seguir como resolver o problema dos espaços em branco usando os marcadores de corte (trim markers) de templates do Go.
Digamos que queremos formatar esta estrutura de dados aninhada:
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"},
},
}
Uma maneira natural de escrever o template é usar blocos {{ range }} padrão:
{{ range $name, $map := . }}
{{ $name }}:
{{ range $name, $values := $map }}
{{ $name }}:
{{ range $value := $values }}
{{ $value }}
{{ end }}
{{ end }}
{{ end }}
Como cada quebra de linha e espaço de indentação no template é impresso exatamente como foi escrito, a saída fica cheia de linhas em branco:
1:
1.1:
1.1.1
1.1.2
1.1.3
2:
...
-)
🔗Você pode instruir o motor de templates do Go a consumir os espaços em branco adjacentes adicionando um sinal de menos (-) dentro das tags de ação:
{{- ... }} remove todos os espaços em branco anteriores (espaços, tabulações e quebras de linha) até o caractere anterior que não seja espaço em branco.{{ ... -}} remove todos os espaços em branco seguintes até o próximo caractere que não seja espaço em branco.Para corrigir nosso loop aninhado, posicionamos estrategicamente o marcador - para consumir as quebras de linha de formatação do template sem remover a indentação desejada:
{{- range $name, $map := . -}}
{{ $name }}:
{{- range $name, $values := $map }}
{{ $name }}:
{{- range $value := $values }}
{{ $value }}
{{- end }}
{{- end }}
{{ end -}}
Ao remover as quebras de linha imediatamente após as declarações range e os blocos end, obtemos uma saída limpa e compacta:
1:
1.1:
1.1.1
1.1.2
1.1.3
2:
2.1:
2.1.1
2.1.2
2.1.3
Você pode copiar e executar este código para testar o comportamento diretamente.
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("'''")
}
Baixe a edição offline selecionada de O Estilo de Vida do Kaue—um guia prático para otimizar 🍏 Saúde, 💰 Riqueza, ❤️ Amor e 🧘 Sentido.
Receba notificações quando eu publicar novos ensaios, resumos de livros e guias práticos sobre como viver bem. Sem spam—cancele quando quiser.
Tem alguma pergunta, perspectiva ou sugestão? Compartilhe suas ideias abaixo. Os comentários usam o GitHub Discussions (sem anúncios e sem spam)—clique em Entrar com o GitHub abaixo para comentar ou reagir (criar uma conta gratuita no GitHub leva menos de um minuto).
Atualizado em 11 de out. de 2026.
AVISO LEGAL: O conteúdo deste site tem finalidade exclusivamente informativa e educacional e não constitui aconselhamento médico, psicológico, financeiro, de investimentos, tributário ou jurídico. As ideias, a curadoria e as opiniões aqui apresentadas são exclusivamente minhas e não representam as do meu empregador. Os resumos de livros, palestras e artigos são comentários educacionais independentes e permanecem propriedade intelectual de seus respectivos autores. Ferramentas de IA podem ser utilizadas para auxiliar na edição, formatação e síntese; embora todos os esforços sejam feitos para garantir a precisão, erros podem ocorrer. PRIVACIDADE: Este site utiliza serviços de terceiros para inscrição opcional em newsletter (follow.it), comentários (giscus / GitHub Discussions) e mídia incorporada (YouTube), que podem processar endereços IP e cookies dos visitantes de acordo com suas respectivas políticas de privacidade.