Ich wollte eine kleine eigenständige Webanwendung in Go erstellen, das Gegenteil einer regulären Webanwendung, bei der Ressourcen separat über einen CDN- oder HTTP-Server wie Nginx bereitgestellt werden. Wenn die Leistung jedoch keine entscheidende Rolle spielt oder die Anwendung für einen geringen Datenverkehr ausgelegt ist, vereinfacht die Verwendung einer eigenständigen Anwendung die Bereitstellung und Verteilung, da es sich lediglich um eine ausführbare Binärdatei handelt. Für die Einbettung von Ressourcen in eine Go-Anwendung stehen mehrere Pakete zur Verfügung: Reis Statik Bindata Ich werde nicht auf die Besonderheiten der einzelnen Bibliotheken eingehen, aber ich bevorzuge den Ansatz aufgrund seiner Benutzerfreundlichkeit und aktiven Unterstützung. Bindata- Erste Schritte Erstellen wir zunächst eine im Verzeichnis in Ihrem Projekt: index.html frontend/ <html> <body> Hello, World! </body> </html> Nachdem wir nun ein Projekt eingerichtet und eine statische Ressource zum Testen haben, installieren wir mit dem folgenden Befehl: Bindata go get -u github.com/jteeuwen/go-bindata/... Wir sind bereit, den Backend-Code der Webanwendung auszuführen. Erstellen Sie eine Datei und kopieren Sie den folgenden Code: 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) } Wichtige Zeile in diesem Code: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... Die obige Zeile ermöglicht es uns, den Befehl auszuführen, wenn aufgerufen wird. Ab Version 1.4 können Sie während der Generierungsphase benutzerdefinierte Befehle ausführen. Sie müssen lediglich zu Ihrer go-Datei hinzufügen. go-bindata go generate //go:generate command argument... Die Befehlszeile verfügt über mehrere Parameter. Lesen Sie daher in der nach, wie Sie sie verwenden. In unserem Fall sagen wir: go-bindata Dokumentation definiert einen Teil des Pfadnamens für statisch -prefix "frontend/" definiert den Paketnamen, der im generierten Code verwendet wird -pkg main definiert den Namen der generierten Datei -o bindata.go Nach dem Ausführen des Befehls sollte eine generierte Datei mit dem Namen angezeigt werden. Die Struktur Ihres Projekts sollte wie folgt aussehen: go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go Die Logik zum Bereitstellen statischer Dateien befindet sich in der Funktion , die die Anfrage empfängt und prüft, ob der Pfad mit dem statischen Pfad übereinstimmt. Die Prüfung erfolgt mithilfe der Funktion, die vom Benutzer automatisch exportiert wird. Wenn die Ressource nicht existiert, geben wir eine zurück, andernfalls geben wir den Inhalt der Ressource zurück. static_handler Asset bindata.go 404 Der Rest des Codes dient zum Erstellen der Webanwendung und zum Binden unserer Vorlage, damit sie allen eingehenden Anforderungen für entspricht. Wenn Sie Schwierigkeiten haben, diesen Code zu verstehen, lesen Sie die offizielle Go- für . static_handler / Dokumentation http package Als kurze Erinnerung daran, wie Go mit Paketen umgeht: Alle Bezeichner werden automatisch in andere Pakete mit demselben Namen exportiert, wenn der erste Buchstabe des Bezeichnernamens mit einem Großbuchstaben beginnt. Basierend auf dieser Regel stellt die Datei die Funktion für das bereit. Dadurch wird ein Asset für den angegebenen Namen geladen und zurückgegeben. Es wird ein Fehler zurückgegeben, wenn die Ressource nicht gefunden oder geladen werden kann. bindata.go Asset main