在 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中文网其他相关文章!