ホームページ > バックエンド開発 > Golang > Go バイナリに埋め込まれた静的ファイルを提供するにはどうすればよいですか?

Go バイナリに埋め込まれた静的ファイルを提供するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-07 02:50:18
オリジナル
183 人が閲覧しました

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 実装は利用できます。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート