首页 > 后端开发 > Golang > 如何提供 Go 二进制文件中嵌入的静态文件?

如何提供 Go 二进制文件中嵌入的静态文件?

Mary-Kate Olsen
发布: 2024-12-07 02:50:18
原创
195 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板