Dando continuidade ao post sobre como criar websites em Go, vamos nos aprofundar um pouco mais no package html/template, ou seja, vamos ver como renderizar variáveis, criar condicionais e loop dentro de um template HTML.
Variáveis
No package html/template, as variáveis permitem injetar conteúdo dinâmico nos seus templates HTML.
Um variável é identificada no template por {{.NomeDaVariavel}}. Por exemplo:
<title>{{.Titulo}}</title>
No Go, de preferência, precisamos criar uma struct para passar o valor dessa variável.
type Pagina struct {
Titulo string
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("index.html")
p := Pagina{Titulo: "Minha Página"}
tmpl.Execute(w, p)
}
Note que a variável não é nome da struct, mas sim seu atributo.
Condicionais
Os condicionais permitem renderizar partes do HTML baseadas em condições lógicas. Usamos {{if condicao}} ... {{end}} para isso, o que permite uma experiência de usuário mais rica e personalizada. Veja o exemplo:
{{if .Logado}}
<h1>Bem-vindo {{.Nome}}!</h1>
{{else}}
<h1>Por favor, faça login.</h1>
{{end}}
Da mesma forma que vimos na primeira sessão, precisamos criar uma struct com os atributos Nome e Logado.
type Usuario struct {
Nome string
Logado bool
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("index.html")
u := Usuario{Nome: "Tiago Temporin", Logado: true}
tmpl.Execute(w, u)
}
Loop
Para iterar sobre slices ou arrays, usamos {{range .Colecao}} ... {{end}}. Isso é útil para listar itens dinamicamente:
<ul>
{{range .Itens}}
<li>{{.}}</li>
{{end}}
</ul>
Para esse exemplo, o código Go ficaria assim:
type Pagina struct {
Itens []string
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("index.html")
p := Pagina{Itens: []string{"Item 1", "Item 2", "Item 3"}}
tmpl.Execute(w, p)
}
Já para casos mais complexos, como por exemplo, listar produtos ou posts de um blog, teríamos que criar no mínimo duas structs. A primeira para armazenar os dados do produto ou post, enquanto a segunda ficará encarregada de transportar o slice da primeira para o template.
type Produto struct {
Nome string
Preco float64
}
type Pagina struct {
Produtos []Produto
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("index.html")
p := Pagina{
Produtos: []Produto{
{Nome: "Produto 1", Preco: 10.99},
{Nome: "Produto 2", Preco: 20.99},
{Nome: "Produto 3", Preco: 30.99},
},
}
tmpl.Execute(w, p)
}
Já o template HTML ficaria assim:
<!DOCTYPE html>
<html>
<head>
<title>Lista de Produtos</title>
</head>
<body>
<h1>Produtos</h1>
<ul>
{{range .Produtos}}
<li>{{.Nome}} - R$ {{printf "%.2f" .Preco}}</li>
{{end}}
</ul>
</body>
</html>
Note que dentro do loop só precisamos referenciar os atributos da struct iterada.
Conclusão
Dominar esses três aspectos do package html/template potencializa o desenvolvimento de aplicações web em Go, permitindo a criação de páginas mais complexas, seguras e com ótima performance.
Espero que essas dicas ajudem você a começar a explorar as possibilidades que Go oferece para o desenvolvimento web.
Até a próxima!
Faça parte da comunidade!
Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.
Livros Recomendados
Abaixo listei alguns dos melhores livros que já li sobre GO.





Como formatar para valores BRL R$ 1.000,00 ( ponto separar milhar e vírgula para decimal)?