Je voulais créer une petite application Web autonome dans Go, à l'opposé d'une application Web classique où les ressources seraient servies séparément via un serveur CDN ou HTTP tel que Nginx. Toutefois, si les performances ne constituent pas une préoccupation critique ou si l'application est destinée à un faible trafic, l'utilisation d'une application autonome simplifie le déploiement et la distribution car il s'agit simplement d'un binaire exécutable. Plusieurs packages sont disponibles pour intégrer des ressources dans une application Go : Riz Statistique Bindata Je n'entrerai pas dans les spécificités de chaque bibliothèque, mais je préfère l'approche en raison de sa facilité d'utilisation et de son support actif. bindata Commencer Tout d'abord, créons un dans le répertoire de votre projet : index.html frontend/ <html> <body> Hello, World! </body> </html> Maintenant que nous avons une configuration de projet et une ressource statique à tester, installons à l'aide de la commande : bindata go get -u github.com/jteeuwen/go-bindata/... Nous sommes prêts à exécuter le code backend de l'application Web. Créez un fichier et copiez le code suivant : 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) } Ligne importante dans ce code : //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... La ligne ci-dessus nous permet d'exécuter la commande lorsque est appelé. Depuis la version 1.4, vous pouvez exécuter des commandes personnalisées pendant la phase de génération. Il s'agit simplement d'ajouter à votre fichier go. go-bindata go generate //go:generate command argument... La ligne de commande a plusieurs paramètres, alors consultez la pour savoir comment l'utiliser. Dans notre cas, nous disons : go-bindata documentation définit une partie du chemin d'accès pour le statique -prefix "frontend/" définit le nom du package utilisé dans le code généré -pkg main définit le nom du fichier généré -o bindata.go Après avoir exécuté la commande , vous devriez voir un fichier généré nommé . La structure de votre projet devrait ressembler à ceci : go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go La logique de service des fichiers statiques se trouve dans la fonction , qui reçoit la demande et vérifie si le chemin correspond au chemin statique. La vérification se fait à l'aide de la fonction , automatiquement exportée par l'utilisateur . Si la ressource n'existe pas, on renvoie un , sinon, on renvoie le contenu de la ressource. static_handler Asset bindata.go 404 Le reste du code sert à créer l'application Web et à lier notre modèle pour qu'il corresponde à toutes les demandes entrantes pour . Si vous avez du mal à comprendre ce code, consultez la officielle Go pour . static_handler / documentation http package Pour rappel rapide de la façon dont Go gère les packages, tous les identifiants seront automatiquement exportés vers d'autres packages portant le même nom si la première lettre du nom de l'identifiant commence par une lettre majuscule. Sur la base de cette règle, le fichier fournit la fonction pour le package . Cela charge et renvoie un actif pour le nom donné. Il renvoie une erreur si la ressource est introuvable ou ne peut pas être chargée. bindata.go Asset main