【发布时间】: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"))
在我的理解中,有两种方法可以将这两个指针传递给其他包:
-
将两个指针包装成两个包(
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 -
初始化 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