El paquete embed
en Go permite incluir archivos o directorios estáticos (como archivos de texto, HTML, imágenes, etc.) dentro de un binario compilado. Esto es útil para aplicaciones que necesitan acceder a archivos sin depender de su presencia en el sistema de archivos, ya que estos archivos se integran directamente en el ejecutable.
embed
en Go?
embed
es un paquete introducido en Go 1.16 que permite la inclusión de archivos en el binario compilado utilizando directivas especiales en el código. Esto es especialmente útil para aplicaciones que necesitan distribuir recursos como plantillas HTML, archivos de configuración o contenido estático.
embed
Para utilizar embed
, debes importar el paquete y usar la directiva //go:embed
seguida del nombre del archivo o directorio que quieres incrustar. Los archivos se pueden incrustar en variables de tipo string
, []byte
o embed.FS
.
embed
Este es un ejemplo sencillo de cómo incluir un archivo de texto en tu programa Go:
package main
import (
"embed"
"fmt"
)
//go:embed mensaje.txt
var mensaje string
func main() {
fmt.Println(mensaje) // Imprime el contenido del archivo mensaje.txt
}
En este ejemplo, el archivo mensaje.txt
se incrusta en la variable mensaje
, que es de tipo string
. Al compilar y ejecutar el programa, se imprimirá el contenido de mensaje.txt
sin necesidad de que el archivo esté en el sistema de archivos en tiempo de ejecución.
También puedes incrustar múltiples archivos o incluso directorios completos utilizando comodines o listando varios archivos con la directiva //go:embed
.
//go:embed archivo1.txt archivo2.txt
var archivos embed.FS
En este caso, se pueden incluir varios archivos en la variable archivos
de tipo embed.FS
, lo que permite leer su contenido posteriormente en el programa.
//go:embed static/*
var contenidoStatic embed.FS
Este ejemplo incrusta todos los archivos dentro del directorio static
. Puedes acceder a ellos usando las funciones del tipo embed.FS
como ReadFile
o Open
.
data, _ := contenidoStatic.ReadFile("static/index.html")
fmt.Println(string(data)) // Muestra el contenido de index.html
Aquí tienes un ejemplo más completo que incrusta un archivo HTML y lo sirve a través de un servidor HTTP:
package main
import (
"embed"
"fmt"
"net/http"
)
//go:embed index.html
var indexHTML string
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, indexHTML)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Este programa incrusta el archivo index.html
y lo sirve a través de un servidor HTTP, lo que permite distribuir el contenido estático sin depender del sistema de archivos en tiempo de ejecución.
Para más información sobre el uso de embed
en Go, consulta la documentación oficial de Go.
Jorge García
Fullstack developer