Quería crear una pequeña aplicación web independiente en Go, lo opuesto a una aplicación web normal donde los recursos se servirían por separado a través de un servidor CDN o HTTP como Nginx. Sin embargo, si el rendimiento no es una preocupación crítica o la aplicación está diseñada para poco tráfico, el uso de una aplicación independiente simplifica la implementación y distribución porque es solo un binario ejecutable. Hay varios paquetes disponibles para incorporar recursos en una aplicación Go: Arroz estadística datos binarios No profundizaré en los detalles de cada biblioteca, pero prefiero el enfoque debido a su facilidad de uso y soporte activo. bindata Empezando Primero, creemos un dentro del directorio de tu proyecto: index.html frontend/ <html> <body> Hello, World! </body> </html> Ahora que tenemos una configuración de proyecto y un recurso estático para probar, instalemos usando el comando: bidata go get -u github.com/jteeuwen/go-bindata/... Estamos listos para ejecutar el código backend de la aplicación web. Cree un archivo y copie el siguiente código: main.go package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) } Línea importante en este código: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... La línea anterior nos permite ejecutar el comando cuando se llama . A partir de la versión 1.4, puedes ejecutar comandos personalizados durante la fase de generación. Es sólo cuestión de agregar a su archivo go. go-bindata go generate //go:generate command argument... La línea de comando tiene varios parámetros, así que consulte la sobre cómo usarla. En nuestro caso decimos: go-bindata documentación define parte de la ruta para estática -prefix "frontend/" define el nombre del paquete utilizado en el código generado -pkg main define el nombre del archivo generado -o bindata.go Después de ejecutar el comando , debería ver un archivo generado llamado . La estructura de su proyecto debería verse así: go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go La lógica para entregar archivos estáticos está en la función , que recibe la solicitud y verifica si la ruta coincide con la ruta estática. La verificación se realiza mediante la función , exportada automáticamente por el usuario . Si el recurso no existe, devolvemos un ; de lo contrario, devolvemos el contenido del recurso. static_handler Asset bindata.go 404 El resto del código es para crear la aplicación web y vincular nuestra plantilla para que coincida con todas las solicitudes entrantes de . Si tiene problemas para comprender este código, consulte la oficial de Go para . static_handler / documentación http package Como recordatorio rápido de cómo Go maneja los paquetes, todos los identificadores se exportarán automáticamente a otros paquetes con el mismo nombre si la primera letra del nombre del identificador comienza con una letra mayúscula. Según esta regla, el archivo proporciona la función para el paquete . Esto carga y devuelve un activo para el nombre de pila. Devuelve un error si no se puede encontrar el recurso o no se puede cargar. bindata.go Asset main