私は別のファイルを別のファイルに分けて、どのページに関連しているのかを分けました。私はgorilla/sessions
を使用してクライアントセッションとユーザー認証を管理し、go-sql-driver
を使用してMySQLデータベースにアクセスします。Goで1つのパッケージから別のパッケージにサービスポインタを渡すには?
プロジェクトレイアウト:
<PROJECT ROOT>
-> <cliend> // This folder containing html, css, and js
-> <pagehndler>
-> <index>
-> index.go // Need to access database and session
-> <projbrwsr>
-> projbrwsr.go // Need to access database and session
-> main.go
はしたがって、私はgorilla/sessions
サービス
var store = sessions.NewCookieStore([]byte("something-very-secret"))
を指しgo-sql-driver
サービス
db, err := sql.Open("mysql", "user:[email protected]/dbname")
と1ポインタに2つの方法があります1指し示すポインタを持っています2つのポインタを他のパッケージに渡すnは私の理解:
は二つのパッケージ(
sess
、db
)に二つのポインタをラップし、それらをエクスポートします。そして、パッケージをインポートするために必要なサービスを必要とするパッケージ(sess
、db
)。エクスポートされたポインタを呼び出します。<PROJECT ROOT> -> <cliend> // This folder containing html, css, and js -> <pagehndler> -> <index> -> index.go // Need to access database and session -> <projbrwsr> -> projbrwsr.go // Need to access database and session -> <service> -> sess.go // Storing the database service pointer -> db.go // Storing the session service pointer -> main.go
メインパッケージに2つのポインタを初期化し、引数として、ページハンドルの機能が含まれている別のパッケージに渡します。別のパッケージの中で、argsをローカル変数に設定して、別のパッケージでローカルに呼び出すことができます。
<PROJECT ROOT> -> <cliend> // This folder containing html, css, and js -> <pagehndler> -> <index> -> index.go // Need to access database and session // Containing a func newService(db *DB) -> <projbrwsr> -> projbrwsr.go // Need to access database and session // Containing a func newService(sess *CookieStore) -> main.go
それらを呼び出すために、他のハンドルの機能のために他のパッケージには、この二つのポインタを渡すための最良の方法は何ですか?
変数がエクスポートされた場合(つまり、大文字で始まる場合)、パッケージ名で修飾することで、どのパッケージからでもアクセスできます。あなたは "2つのパッケージにポインタをラップする"ことについて話しているので、それは今では別々のパッケージに入っていないということですか?あなたのコードがどのように編成されているかについてもっと説明できますか? –
コメントありがとうございました。私は自分の投稿を更新しました。 – Casper
私は明示的に依存関係をパッケージの境界を越えてコンストラクタ関数に渡すことを好みます。私は実際にメソッド1からメソッド2へプロジェクトをリファクタリングしています。[ここで私のwip](https://github.com/namely/broadway/pull/121/files#diff-1427b112aa72f64adcf839007e954d56R18)ここで私は共有 ' cfg.Type'を開き、cmdパッケージからサーバーパッケージ – Plato