package html/template

Como renderizar templates HTML em Go

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.

Um comentário sobre “Como renderizar templates HTML em Go

Deixe uma resposta