Statische Dateien aus Binärdateien in Go bereitstellen: Ein benutzerdefiniertes Dateisystem
Beim Bereitstellen statischer Dateien in Go vereinfacht der FileServer-Handler den Prozess. In Fällen, in denen jedoch nur wenige statische Dateien bereitgestellt werden müssen, kann ein alternativer Ansatz die externe Verwaltung dieser Dateien überflüssig machen.
InMemoryFS-Implementierung
Der FileServer erfordert ein FileSystem-Objekt, was zu der Frage führt, wie statische Dateien in eine Binärdatei umgewandelt werden können. Eine Implementierung von InMemoryFS kann Dateien aus dem Speicher bereitstellen, sodass keine direkte Interaktion mit dem Dateisystem erforderlich ist.
package main import ( "io" "net/http" "time" ) type InMemoryFS map[string]io.ReadCloser // Implements FileSystem interface func (fs InMemoryFS) Open(name string) (http.File, error) { f, ok := fs[name] if !ok { return nil, os.ErrNotExist } return &InMemoryFile{ ReadCloser: f, }, nil } type InMemoryFile struct { io.ReadCloser } // Implements http.File interface func (f *InMemoryFile) Close() error { return nil } func (f *InMemoryFile) Stat() (os.FileInfo, error) { fi, err := f.ReadCloser.Stat() if err != nil { return nil, err } return &InMemoryFileInfo{ name: f.ReadCloser.(os.FileInfo).Name(), size: fi.Size(), modTime: fi.ModTime(), }, nil } type InMemoryFileInfo struct { name string size int64 modTime time.Time } // Implements os.FileInfo func (s *InMemoryFileInfo) Name() string { return s.name } func (s *InMemoryFileInfo) Size() int64 { return s.size } func (s *InMemoryFileInfo) Mode() os.FileMode { return 0644 } func (s *InMemoryFileInfo) ModTime() time.Time { return s.modTime } func (s *InMemoryFileInfo) IsDir() bool { return false } func (s *InMemoryFileInfo) Sys() interface{} { return nil }
Beispielverwendung
Die InMemoryFS-Implementierung kann verwendet werden mit dem FileServer wie folgt:
func main() { FS := make(InMemoryFS) // Load static files into memory FS["foo.html"] = os.Open("foo.html") FS["bar.css"] = os.Open("bar.css") http.Handle("/", http.FileServer(FS)) http.ListenAndServe(":8080", nil) }
Alternative Überlegungen
Anstatt ein benutzerdefiniertes Dateisystem zu erstellen, ist es möglicherweise einfacher, den Bereitstellungsteil neu zu schreiben, um eine kleine Anzahl statischer Dateien direkt zu verarbeiten und so die Notwendigkeit zu vermeiden, ein vollständiges Dateisystem zu emulieren. Letztendlich hängt der beste Ansatz von den spezifischen Anforderungen des Projekts ab.
Das obige ist der detaillierte Inhalt vonWie kann ich statische Dateien bereitstellen, die in eine Go-Binärdatei eingebettet sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!