Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Melayan Fail Statik yang Dibenamkan dalam Perduaan Go?

Bagaimanakah Saya Boleh Melayan Fail Statik yang Dibenamkan dalam Perduaan Go?

Mary-Kate Olsen
Lepaskan: 2024-12-07 02:50:18
asal
174 orang telah melayarinya

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

Menyajikan Fail Statik daripada Binari dalam Go: Sistem Fail Tersuai

Apabila menyiarkan fail statik dalam Go, pengendali FileServer memudahkan proses. Walau bagaimanapun, untuk kes di mana hanya beberapa fail statik perlu digunakan, pendekatan alternatif boleh menghapuskan keperluan untuk mengurus fail tersebut secara luaran.

Pelaksanaan InMemoryFS

Pelayan Fail memerlukan objek FileSystem, yang membawa kepada persoalan bagaimana untuk membakar fail statik ke dalam binari. Pelaksanaan InMemoryFS boleh menyampaikan fail daripada memori, menghapuskan keperluan untuk berinteraksi dengan sistem fail secara langsung.

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 }
Salin selepas log masuk

Contoh Penggunaan

Pelaksanaan InMemoryFS boleh digunakan dengan FileServer seperti berikut:

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)
}
Salin selepas log masuk

Alternatif Pertimbangan

Daripada mencipta Sistem Fail tersuai, mungkin lebih mudah untuk menulis semula bahagian penyajian untuk mengendalikan sebilangan kecil fail statik secara langsung, mengelakkan keperluan untuk meniru sistem fail yang lengkap. Akhirnya, pendekatan terbaik bergantung pada keperluan khusus projek.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melayan Fail Statik yang Dibenamkan dalam Perduaan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan