如何将服务指针从一个包传递到Go中的另一个包?

时间:2016-07-30 03:02:07

标签: pointers go pass-by-reference

我根据与他们相关的页面在不同的文件中分隔了不同的http.HandleFunc。我使用gorilla/sessions来管理客户端会话和用户身份验证,我使用go-sql-driver来访问MySQL数据库。

项目布局:

<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

因此,我有一个指针指向go-sql-driver服务

db, err := sql.Open("mysql", "user:password@/dbname")

和1指针指向gorilla/sessions服务

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

根据我的理解,有两种方法可以将两个指针传递给其他包:

  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. 初始化主包中的两个指针,并将它们传递给包含页面句柄函数的另一个包,如args。在另一个包中,将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
    
  3. 将这两个指针传递给其他包的其他句柄函数调用它们的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

这是应该有效的概念。

在包内,你应该声明一个导出的变量。这个变量必须是一个指针。

var myVar = 3
var MyPointer = &myVar

JSFiddle

在主程序包中,您可以设置指向“全局”数据库或会话地址的指针。

mypackage.MyPointer = dbPointer

然后包中的指针指向dbPointer。我认为这是将指针传递给其他包的好方法。