2

非常に単純な Go Web アプリケーションを構築しようとしていますが、golang の「パッケージごとのフォルダー」構造が問題になっています。

github.com/gorilla/muxルーターとして、およびgithub.com/unrolled/renderテンプレートのレンダリングに使用しています。つまり、アプリの起動時に新しいルーターと新しいレンダラーを作成する必要があり、レンダラーにアクセスするにはすべてのルートが必要です。

これは、単一のファイルで行うのが非常に簡単です。

func main() {

  ...

  r := render.New(render.Options{
    // a lot of app specific setup
  })


  mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    r.HTML(w, http.StatusOK, "myTemplate", nil)
  })

  ...

}

しかし、これは私がGoを理解していないところです。サブフォルダー内の個別のファイルにルートが必要なため (私のプロジェクトは大きくなります)、routesパッケージに含める必要があります。もちろん、これによりレンダラー変数にアクセスできなくなります。呼び出しは、テンプレート フォルダーやアセット パスのヘルパーなど、大量のアプリ固有のものを渡すことに依存しているroutesため、パッケージ内にレンダラーを作成することはできません。render.New()

ハンドラー関数を、既に初期化されたレンダラーを持つ構造体で機能させるというルートをたどりました...

func (app *App) Hello2(w http.ResponseWriter, r *http.Request) {
  app.Renderer.HTML(w, http.StatusOK, "myTemplate", nil)
}

しかし、 で初期化されたときにパッケージapp *App内でこれにアクセスする方法については、まだ混乱しています。ファイルのフラットなリストがあれば、Go のすべてが非常に簡単に見えますが、フォルダー構造が少し必要になるとすぐに、パッケージのセットアップが問題になります。routesmain

ここにはおそらく何かが欠けているので、助けていただければ幸いです。

4

1 に答える 1

0

Go での依存関係の処理に関する一般的な情報を次に示します。重要なトリックは、ビューがインポートできるパッケージで変数を宣言するだけでよいということです。パッケージ自体で開始された ( ) または から設定された を使用してパッケージをRender作成できます。myapp/rendervar Renderfunc init()main

しかし、あなたが見つけたコンテキストは、このアプリが必要とする以上のものかもしれませんが、まったく正気のように聞こえます. これの優れた点は、コンテキストがリクエストごとのコードで設定されるため、後でそれを拡張して、Host:ヘッダーを使用しLayoutて別のドメイン経由でアプリをロードする人々に別のものを提供するなどの卑劣なことを行うことができることです。がグローバルに焼き付けられている場合はLayout、できません。これは本当の利点です。リクエストごとの変更を、さまざまなグローバル変数の周りに構成がスプレーされた大きなコードベースにレトロフィットしようとしましたが、それは苦痛です。

于 2014-11-14T05:02:39.267 に答える