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

Pointers 如何在Go中将服务指针从一个包传递到另一个包?,pointers,go,pass-by-reference,Pointers,Go,Pass By Reference,我将不同的http.HandleFunc根据它们与哪个页面相关而在不同的文件中分开。我使用gorilla/sessions管理客户端会话和用户身份验证,并使用go-sql-driver访问MySQL数据库 项目布局: <PROJECT ROOT> -> <cliend> // This folder containing html, css, and js -> <pagehndler>

我将不同的
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
还有一个指针指向
gorilla/sessions
服务

db, err := sql.Open("mysql", "user:password@/dbname")
var store = sessions.NewCookieStore([]byte("something-very-secret"))
据我所知,有两种方法可以将这两个指针传递给其他包:

  • 将两个指针包装成两个包(
    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
    
    
    ->//此文件夹包含html、css和js
    -> 
    -> 
    ->index.go//需要访问数据库和会话
    -> 
    ->projbrwsr.go//需要访问数据库和会话
    -> 
    ->sess.go//存储数据库服务指针
    ->db.go//存储会话服务指针
    ->梅因,加油
    
  • 初始化主包中的两个指针,并将它们作为参数传递给另一个包,该包包含页面句柄函数。在另一个包中,将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
    
    
    ->//此文件夹包含html、css和js
    -> 
    -> 
    ->index.go//需要访问数据库和会话
    //包含func新闻服务(db*db)
    -> 
    ->projbrwsr.go//需要访问数据库和会话
    //包含func新闻服务(sess*CookieStore)
    ->梅因,加油
    

  • 将这两个指针传递给其他包,以便其他句柄函数调用它们的最佳方法是什么?

    这是应该起作用的概念

    在包内,您应该声明一个变量,该变量将被导出。此变量必须是指针

    var myVar = 3
    var MyPointer = &myVar
    

    从主包中,您可以设置指向“全局”db或会话地址的指针

    mypackage.MyPointer = dbPointer
    

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

    如果导出变量(即,以大写字母开头),您可以通过限定包名从任何包访问它们。既然你说的是“将指针包装成两个包”,这是否意味着它们现在不在单独的包中?你能解释一下你的代码是如何组织的吗?谢谢你的评论。我已经更新了我的帖子。我更喜欢显式地将依赖项跨包边界传递到构造函数中。实际上,我现在正在将一个项目从方法1重构到方法2,在这里我定义了一个共享的
    cfg.Type
    ,并将它从我的cmd包传递到服务器包。这个方法类似于javascript。我们可以在外部为包创建和分配值。对吗?是和否。您不能创建变量,但可以为其赋值。另一种可能是将变量传递给包中的所有函数。通过“args”将变量传递给所有函数?是。将是功能性的方式。如果在函数内部需要db引用,为什么不使用一个参数传递引用?更容易测试更容易理解,特别是如果你的软件包很大。