//go:embed para Arquivos e Templates
//go:embed informa ao compilador para copiar arquivos para o seu pacote para que eles sejam enviados dentro do binário.
Busque em todas as páginas da documentação
//go:embed informa ao compilador para copiar arquivos para o seu pacote para que eles sejam enviados dentro do binário.
Você os lê através de string, []byte ou embed.FS sem abrir caminhos no host de implantação.
go:embed foi introduzido no Go 1.16 e substituiu a maioria dos geradores de código estilo bindata para ativos estáticos.
A diretiva se aplica a variáveis no mesmo pacote, usando padrões glob relativos ao arquivo de origem.
embed.FS implementa io/fs.FS, então http.FileServer, fs.WalkDir e template.ParseFS se compõem naturalmente.
Dados incorporados são somente leitura; mutate cópias na memória se você precisar alterar o conteúdo em tempo de execução.
Cartão de receita de referência rápida - pronto para copiar e colar.
package assets
import "embed"
//go:embed migrations/*.sql
var Migrations embed.FS
//go:embed config/default.yaml
var DefaultConfig []byteQuando usar isso:
example.com/app/
main.go
assets/
migrations/
001_init.sql
templates/
home.html
// main.go
package main
import (
"embed"
"html/template"
"io/fs"
"log"
"net/http"
)
//go:embed assets/migrations/*.sql
var migrations embed.FS
//go:embed assets/templates/*.html
var templates embed.FS
func main() {
sql, err := fs.ReadFile(migrations, "assets/migrations/001_init.sql")
if err != nil {
log.Fatal(err)
}
log.Printf("bytes da migração: %d", len(sql))
tpl, err := template.ParseFS(templates, "assets/templates/*.html")
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
_ = tpl.ExecuteTemplate(w, "home.html", nil)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}O que isso demonstra:
//go:embed podem existir em um pacote.assets/migrations/...).template.ParseFS carrega templates sem caminhos de disco em tempo de execução.//go:embed acima das variáveis de nível de pacote.embed.FS serve esses bytes através das APIs io/fs.init lê o sistema de arquivos na máquina de destino.| Regra | Detalhe |
|---|---|
| Tipos de variável | Apenas string, []byte, embed.FS |
| Localização | Diretório do pacote ou subdiretório |
| Proibido | .., caminhos absolutos, links simbólicos fora da árvore |
| Arquivos ocultos | Nomes que começam com . são excluídos, a menos que sejam nomeados explicitamente |
| Correspondência vazia | Erro de compilação se um padrão não corresponder a nada |
//go:embed static/*
var static embed.FS
sub, _ := fs.Sub(static, "static")
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(sub))))fs.Sub remove o prefixo incorporado para que os URLs mapeiem de forma limpa.
import _ "embed" // necessário ao usar //go:embed sem referenciar embed no códigoSe você incorporar apenas em []byte e nunca nomear embed.FS, a importação em branco satisfaz o compilador.
ReadFile usa o caminho incorporado completo, incluindo diretórios do padrão. Correção: registre fs.WalkDir uma vez ou corresponda exatamente ao prefixo do padrão.os.Chdir em testes porque os dados não são lidos do disco em tempo de execução. Correção: teste através das APIs do FS incorporado.ExecuteTemplate usa o nome definido do template, nem sempre o nome do arquivo. Correção: chame tpl.DefinedTemplates() durante o desenvolvimento.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Arquivos de disco + ConfigMap/volume | Ativos grandes ou atualizados com frequência | Você precisa de portabilidade estrita de binário único |
Ferramentas go:generate bindata | Projetos legados já com geradores | Iniciando código greenfield Go 1.16+ |
| Incorpore apenas padrões; busque o resto | Híbrido offline/online | Cada byte deve ser air-gapped |
text/template com ParseFiles em desenvolvimento | Iteração rápida de template localmente | A produção não deve depender de caminhos de template |
Sim, se eles corresponderem às regras de padrão.
Raro para produção; útil para diagnósticos ou ferramentas estilo go version -m.
Embed lê do layout da árvore de origem no momento da compilação.
Dependências vendidas são módulos separados; incorpore seus próprios arquivos de pacote.
Sim.
Padrões seguem as regras de path.Match; teste com um pequeno diretório primeiro.
Escolha o tipo de variável.
string evita cópias quando você apenas lê; []byte ajuda quando você modifica uma cópia.
Sim, com significado limitado.
ModTime reflete metadados de embed, não o timestamp original do arquivo no disco em tempo de execução.
Cada pacote precisa de sua própria diretiva //go:embed.
Duplicação aumenta o tamanho do binário se ambos os pacotes se vincularem ao mesmo binário.
Ferramentas como goose e golang-migrate aceitam io/fs.FS.
Passe embed.FS ou fs.Sub do seu diretório de migrações.
Não automaticamente.
O linker armazena os bytes que você fornece; comprima os ativos você mesmo se o tamanho for importante.
go:embed é suportado em muitos alvos, mas verifique sua cadeia de ferramentas específica.
TinyGo tem restrições de tamanho; mantenha os ativos incorporados pequenos.
Sim.
Coloque diferentes variáveis //go:embed em arquivos com linhas //go:build opostas.
Versões da Pilha: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos da placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026