Maison > développement back-end > Golang > Comment puis-je servir des fichiers statiques intégrés dans un binaire Go ?

Comment puis-je servir des fichiers statiques intégrés dans un binaire Go ?

Mary-Kate Olsen
Libérer: 2024-12-07 02:50:18
original
173 Les gens l'ont consulté

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

Servir des fichiers statiques à partir de binaires dans Go : un système de fichiers personnalisé

Lors du service de fichiers statiques dans Go, le gestionnaire FileServer simplifie le processus. Cependant, dans les cas où seuls quelques fichiers statiques doivent être déployés, une approche alternative peut éliminer le besoin de gérer ces fichiers en externe.

Implémentation InMemoryFS

Le serveur de fichiers nécessite un objet FileSystem, ce qui soulève la question de savoir comment intégrer des fichiers statiques dans un binaire. Une implémentation d'InMemoryFS peut servir des fichiers à partir de la mémoire, éliminant ainsi le besoin d'interagir directement avec le système de fichiers.

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 }
Copier après la connexion

Exemple d'utilisation

L'implémentation d'InMemoryFS peut être utilisée avec le FileServer comme suit :

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)
}
Copier après la connexion

Alternative Considérations

Au lieu de créer un système de fichiers personnalisé, il pourrait être plus simple de réécrire la partie de desserte pour gérer directement un petit nombre de fichiers statiques, évitant ainsi d'avoir à émuler un système de fichiers complet. En fin de compte, la meilleure approche dépend des exigences spécifiques du projet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal