首頁 > 後端開發 > Golang > 如何提供 Go 二進位檔案中嵌入的靜態檔案?

如何提供 Go 二進位檔案中嵌入的靜態檔案?

Mary-Kate Olsen
發布: 2024-12-07 02:50:18
原創
174 人瀏覽過

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

在Go 中從二進位提供靜態檔案:自訂檔案系統

在Go 中提供靜態檔案時,FileServer 處理程序簡化了流程。但是,對於只需要部署少量靜態文件的情況,另一種方法可以消除在外部管理這些文件的需要。

InMemoryFS 實作

檔案伺服器需要一個 FileSystem 對象,這就導致瞭如何將靜態檔案烘焙成二進位檔案的問題。 InMemoryFS 的實作可以從記憶體提供文件,無需直接與檔案系統互動。

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 }
登入後複製

範例用法

可以利用 InMemoryFS實作文件伺服器如下:

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)
}
登入後複製

替代方案注意事項

與其建立自訂檔案系統,不如重寫服務部分以直接處理少量靜態文件,從而避免模​​擬完整的檔案系統,這可能會更簡單。最終,最佳方法取決於專案的特定要求。

以上是如何提供 Go 二進位檔案中嵌入的靜態檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板