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//存储会话服务指针
->梅因,加油
<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引用,为什么不使用一个参数传递引用?更容易测试更容易理解,特别是如果你的软件包很大。