CDN や Nginx などの HTTP サーバーを介してリソースが個別に提供される通常の Web アプリケーションとは逆に、Go で小さなスタンドアロン Web アプリケーションを作成したいと考えていました。 ただし、パフォーマンスが重要な問題ではない場合、またはアプリケーションが低トラフィックを目的としている場合は、スタンドアロン アプリケーションを使用すると、単なる実行可能なバイナリであるため、展開と配布が簡素化されます。 Go アプリケーションにリソースを埋め込むために、いくつかのパッケージが利用可能です。 米 スタティック バインデータ 各ライブラリの詳細については詳しく説明しませんが、使いやすさと積極的なサポートのため、私は アプローチを好みます。 bindata はじめる まず、プロジェクトの ディレクトリ内に を作成しましょう。 frontend/ index.html <html> <body> Hello, World! </body> </html> プロジェクトのセットアップとテストする静的リソースが準備できたので、次のコマンドを使用して をインストールしましょう。 バインデータ go get -u github.com/jteeuwen/go-bindata/... Web アプリケーションのバックエンド コードを実行する準備ができました。 ファイルを作成し、次のコードをコピーします。 main.go package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) } このコードの重要な行: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... 上記の行により、 呼び出されたときに コマンドを実行できるようになります。バージョン 1.4 では、生成フェーズ中にカスタム コマンドを実行できます。 go ファイルに追加するだけです。 go generate go-bindata //go:generate command argument... コマンドラインにはいくつかのパラメータがあるため、その使用方法については 確認してください。私たちの場合、次のように言います。 go-bindata ドキュメントを 静的パス名の一部を定義します -prefix "frontend/" 生成されたコードで使用されるパッケージ名を定義します -pkg main 生成されるファイルの名前を定義します -o bindata.go コマンドを実行すると、 という名前の生成されたファイルが表示されるはずです。プロジェクトの構造は次のようになります。 go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go 静的ファイルを提供するためのロジックは 関数内にあり、この関数はリクエストを受け取り、パスが静的パスと一致するかどうかを確認します。チェックは、 ユーザーによって自動的にエクスポートされる 関数を使用して行われます。リソースが存在しない場合は を返し、存在しない場合はリソースの内容を返します。 static_handler bindata.go Asset 404 コードの残りの部分は、Web アプリケーションを作成し、 に対するすべての受信リクエストに一致するように テンプレートをバインドするためのものです。このコードを理解するのが難しい場合は、 に関する Go の公式 を確認してください。 / static_handler http package ドキュメント Go がパッケージを処理する方法について簡単に思い出してください。識別子の名前の最初の文字が大文字で始まる場合、すべての識別子は同じ名前を持つ他のパッケージに自動的にエクスポートされます。 このルールに基づいて、 ファイルは パッケージの 機能を提供します。これにより、指定された名前のアセットがロードされて返されます。リソースが見つからない場合、またはロードできない場合は、エラーが返されます。 bindata.go main Asset