Heim > Backend-Entwicklung > Golang > Wie kann ich statische Dateien bereitstellen, die in eine Go-Binärdatei eingebettet sind?

Wie kann ich statische Dateien bereitstellen, die in eine Go-Binärdatei eingebettet sind?

Mary-Kate Olsen
Freigeben: 2024-12-07 02:50:18
Original
174 Leute haben es durchsucht

How Can I Serve Static Files Embedded in a Go Binary?

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 }
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage