2016-07-30 8 views
2

私は別のファイルを別のファイルに分けて、どのページに関連しているのかを分けました。私は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は私の理解:

  1. は二つのパッケージ(sessdb)に二つのポインタをラップし、それらをエクスポートします。そして、パッケージをインポートするために必要なサービスを必要とするパッケージ(sessdb)。エクスポートされたポインタを呼び出します。

    <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. メインパッケージに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 
    

それらを呼び出すために、他のハンドルの機能のために他のパッケージには、この二つのポインタを渡すための最良の方法は何ですか?

+0

変数がエクスポートされた場合(つまり、大文字で始まる場合)、パッケージ名で修飾することで、どのパッケージからでもアクセスできます。あなたは "2つのパッケージにポインタをラップする"ことについて話しているので、それは今では別々のパッケージに入っていないということですか?あなたのコードがどのように編成されているかについてもっと説明できますか? –

+0

コメントありがとうございました。私は自分の投稿を更新しました。 – Casper

+1

私は明示的に依存関係をパッケージの境界を越えてコンストラクタ関数に渡すことを好みます。私は実際にメソッド1からメソッド2へプロジェクトをリファクタリングしています。[ここで私のwip](https://github.com/namely/broadway/pull/121/files#diff-1427b112aa72f64adcf839007e954d56R18)ここで私は共有 ' cfg.Type'を開き、cmdパッケージからサーバーパッケージ – Plato

答えて

2

これは動作するはずの概念です。

パッケージ内では、変数を宣言してエクスポートする必要があります。この変数はポインタでなければなりません。

var myVar = 3 
var MyPointer = &myVar 
あなたが「グローバル」DBまたはセッションアドレスへのポインタを設定することができ、あなたのメインパッケージから

https://play.golang.org/p/EQDwGF7pjv

mypackage.MyPointer = dbPointer 

次に、パッケージ内のポインタがdbPointerを指しています。私はこれが他のパッケージにポインタを渡す良い方法だと思います。

+0

に渡します。このメソッドはjavascriptのようです。パッケージに値を作成して外部に割り当てることができます。右? – Casper

+0

はいといいえ。変数を作成することはできませんが、値を割り当てることはできます。別の可能性は、あなたのパッケージのすべての機能に変数を渡すことです。 – apxp

+0

"args"ですべての関数に変数を渡しますか? – Casper

関連する問題