Armazenando arquivos estáticos dentro de programas Go

Lançado na versão 1.16, o pacote embed fornece uma diretiva para adicionar arquivos dentro de programas Go.

import _  embed

//go:embed version.txt
var s string

No exemplo acima estamos importando o pacote embed e depois utilizamos usa diretiva //go:embed e o nome do arquivo/pasta que queremos colocar dentro do nosso programa.

Na próxima linha criamos uma variável onde o conteúdo do arquivo/pasta será armazenado. Essa váriavel pode ser dos tipos string, []byte ou FS (FileSystem).

Se você ainda não conseguiu pensar em uma utilidade para esse pacote, vamos imaginar que você está implementando um site em go usando gofiber.

Nesse projeto, você tem uma pasta chamada views, onde armazena todos os templates das páginas do seu site.

Sem o embed, para manter nosso site funcionando 100%, precisamos manter o binário e a pasta views sempre atualizados no servidor.

Já com o embed, tudo o que precisamos manter atualizado no servidor é o binário, pois todos os arquivos estarão armazenados dentro dele.

Veja o exemplo implementado:

import (
    "embed"
    "log"
    "net/http"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/html"
)

//go:embed views/*
var views embed.FS

func main() {
    // Iniciamos a engine usando a váriavel views que criamos acima
    engine := html.NewFileSystem(http.FS(views), ".html")

    app := fiber.New(fiber.Config{
        Views: engine,
    })
    app.Get("/", func(c *fiber.Ctx) error {
        // Renderiza o template index.html
        return c.Render("views/index", fiber.Map{
            "Nome": "Tiago Temporin",
        })
    })

    log.Fatal(app.Listen(":3000"))
}

É claro que essa técnica pode gerar binários gigantescos, então use com moderação.

Se ficou alguma dúvida, deixe nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go!

Deixe uma resposta