【问题标题】:How to pass service pointers from one package to another package in Go?如何在 Go 中将服务指针从一个包传递到另一个包?
【发布时间】:2016-12-04 19:54:20
【问题描述】:

我根据与哪个页面相关的不同文件将不同的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

因此,我有 1 个指针指向 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. 初始化 main 包中的两个指针,并将它们作为 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
    

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

【问题讨论】:

  • 如果变量被导出(即以大写字母开头),您可以通过包名限定从任何包访问它们。既然您在谈论“将指针包装到两个包中”,这是否意味着它们现在不在单独的包中?你能详细解释一下你的代码是如何组织的吗?
  • 感谢您的评论。我已经更新了我的帖子。
  • 我更喜欢显式地将依赖项跨包边界传递到构造函数中。实际上,我现在正在将项目从方​​法 1 重构为方法 2,here's my wip 在其中我定义了一个共享的 cfg.Type 并将其从我的 cmd 包传递到服务器包

标签: pointers go pass-by-reference


【解决方案1】:

这是应该起作用的概念。

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

var myVar = 3
var MyPointer = &myVar

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

从您的主包中,您可以将指针设置为“全局”数据库或会话地址。

mypackage.MyPointer = dbPointer

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

【讨论】:

  • 这个方法好像在 javascript 中。我们可以在外部创建一个包并为其赋值。对吗?
  • 是和不是。您不能创建变量,但可以为其赋值。另一种可能性是将变量传递给包的所有函数。
  • 通过“args”将变量传递给所有函数?
  • 是的。将是功能性的方式。如果你需要一个函数内部的 db 引用,为什么不应该用一个参数传递引用呢?更容易测试更容易理解,特别是如果你的包很大。
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2022-01-13
  • 2015-01-14
  • 2011-05-02
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多