2016-07-30 25 views
2

Ich habe verschiedene http.HandleFunc in verschiedenen Dateien getrennt nach welcher Seite sie verwandt sind. Ich verwende gorilla/sessions, um Clientsitzungen und Benutzerauthentifizierung zu verwalten, und ich verwende go-sql-driver für den Zugriff auf eine MySQL-Datenbank.Wie übergeben Sie Service-Zeiger in Go von einem Paket an ein anderes?

Projekt Layout:

<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 

Daher habe ich ein Zeiger, der auf den go-sql-driver Service

db, err := sql.Open("mysql", "user:[email protected]/dbname") 

und 1 Zeiger auf gorilla/sessions Service

var store = sessions.NewCookieStore([]byte("something-very-secret")) 

Es gibt zwei Methoden um die zwei Zeiger zu anderen Paketen zu übergeben n mein Verständnis:

  1. Wickeln Sie die beiden Zeiger in zwei Pakete (sess, db) und sie exportiert werden. Und das Paket, das den Service benötigt, um die Pakete zu importieren (sess, db). Und rufe die exportierten Zeiger auf.

    <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. Initialisiere die beiden Zeiger in Hauptpaket und übergeben sie an die ein anderes Paket, dass die Seite Grifffunktionen, wie args enthalten. Setzen Sie die Argumente im anderen Paket auf eine lokale Variable, damit wir sie lokal in einem anderen Paket aufrufen können.

    <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 
    

Was ist der beste Weg, um diese beiden Zeiger auf andere Pakete für andere Griff-Funktion übergeben sie anrufen?

+0

Wenn die Variablen exportiert werden (d. H. Mit einem Großbuchstaben beginnen), können Sie auf sie von jedem beliebigen Paket aus zugreifen, indem Sie sich mit dem Paketnamen qualifizieren. Da Sie davon sprechen, die Zeiger in zwei Pakete zu verpacken, heißt das, dass sie sich jetzt nicht in separaten Paketen befinden? Kannst du mehr darüber erklären, wie dein Code organisiert ist? –

+0

Vielen Dank für Ihren Kommentar. Ich habe meinen Beitrag aktualisiert. – Casper

+1

Ich bevorzuge es, explizit Abhängigkeiten über die Paketgrenze in eine Konstruktorfunktion zu übergeben. Ich bin gerade dabei, ein Projekt von Methode 1 zu Methode 2 zu reformieren, [hier ist mein wip] (https://github.com/namely/broadway/pull/121/files#diff-1427b112aa72f64adcf839007e954d56R18) wo ich eine gemeinsame 'definieren cfg.Type' und übergebe es von meinem cmd-Paket an das Server-Paket – Plato

Antwort

2

Dies ist das Konzept, das funktionieren sollte.

Innerhalb des Pakets sollten Sie eine Variable deklarieren, die exportiert wird. Diese Variable muss ein Zeiger sein.

var myVar = 3 
var MyPointer = &myVar 

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

Von Ihrem Haupt-Paket, das Sie den Zeiger auf Ihre "global" db oder Session-Adresse einstellen.

mypackage.MyPointer = dbPointer 

Dann zeigt der Zeiger in Ihrem Paket auf Ihren dbPointer. Ich denke, das ist ein guter Weg, um einen Zeiger in andere Pakete zu übergeben.

+0

Diese Methode scheint wie in Javascript zu sein.Wir können einen Wert extern erstellen und einem Paket zuweisen. Recht? – Casper

+0

Ja und nein. Sie können keine Variable erstellen, aber Sie können ihr einen Wert zuweisen. Eine andere Möglichkeit wäre, eine Variable an alle Funktionen Ihres Pakets zu übergeben. – apxp

+0

Übergeben Sie eine Variable an alle Funktionen von "args"? – Casper