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 実装は利用できます。 FileServer を次のように使用します:
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 中国語 Web サイトの他の関連記事を参照してください。