英文:
How to store and get a pointer reference in a global scope in GO
问题
我已经得到了以下代码:
package main
func main() {
// 创建一个指向Mongo DB会话的指针引用
session := mongoDB.CreateSession()
// 问题1:如何在全局范围内存储指针引用,并在代码的任何地方使用它
defer session.Close()
// 注意:我假设代码调用处理程序方法,该方法调用控制器包中的Process方法(最后一个代码块)
}
创建MongoDB会话的代码:
package mongoDB
func CreateSession() *mgo.Session {
session, err := mgo.Dial("192.168.0.108:27017/databasename")
if err != nil {
panic(err)
}
session.SetMode(mgo.Monotonic, true)
return session
}
我想要在主函数中存储的指针引用的位置:
package controller
func Process() {
// 问题2:如果可能的话,如何获取存储在问题1中的指针引用
collection := mongoDB.CreateCollection(session, "namedatabase", "colectionData")
mongoDB.InsertData(collection, "Ale", "45646565")
}
我的理解是,你想避免在项目的所有函数中传递指针引用session。
英文:
I have got the follow code:
package main
func main() {
// create a pointer referece of session of Mongo DB
session := mongoDB.CreateSession()
// Question 1 : How to store a pointer reference in a global scope and using anywhere of the code
defer session.Close()
// Note I suppose that the code call to handler methods that call to the Process in the package controller(the last one code)
}
Code of creating a session of MongoDB
package mongoDB
func CreateSession() *mgo.Session {
session, err := mgo.Dial("192.168.0.108:27017/databasename")
if err != nil {
panic(err)
}
session.SetMode(mgo.Monotonic, true)
return session
}
Place where I want to use the pointer reference that was store in the main
package controller
func Process() {
// Question 2 : How can a get the pointer reference store in Question 1 if is posible
collection := mongoDB.CreateCollection(session, "namedatabase", "colectionData")
mongoDB.InsertData(collection, "Ale", "45646565")
}
The idea is to avoid passing by reference session(my pointer reference in the main function) in every one of the functions created for all the project.
答案1
得分: 0
你的controller
包不能导入main
包。这不是一个好主意(我相当确定这是不可能的)。但这并不意味着你不能在controller
中有一个全局的session
变量。
你可以尝试以下代码:
package main
import (
"controller"
"mongoDB"
)
func main() {
// 创建Mongo DB会话的指针引用
session := mongoDB.CreateSession()
defer session.Close()
controller.SetDBSession(session) // 或者使用controller.Init或其他你喜欢的方式
controller.Process()
}
然后在controller
包中:
package controller
import "mongoDB"
// 该包的全局session变量
var session mongoDB.Session
// SetDBSession将mongoDB会话设置为controller包要使用的会话。
// 在调用Process()之前必须调用此函数。
func SetDBSession(s mongoDB.Session) {
session = s
}
func Process() {
collection := mongoDB.CreateCollection(session, "namedatabase", "colectionData")
mongoDB.InsertData(collection, "Ale", "45646565")
}
使用这个解决方案,你只需要将会话传递给controller
包一次,让main
负责创建和关闭会话。
英文:
You can't have your controller
package import main
. That is not a good idea (and I am quite sure it is not even possible). But that doesn't mean you can't have a global session
variable in the controller
.
You can try this:
package main
import (
"controller"
"mongoDB"
)
func main() {
// create a pointer referece of session of Mongo DB
session := mongoDB.CreateSession()
defer session.Close()
controller.SetDBSession(session) // Or controller.Init or whatever you like
controller.Process()
}
And then in the controller
package you have:
package controller
import "mongoDB"
// Global session var for the package
var session mongoDB.Session
// SetDBSession sets the mongoDB session to be used by the controller package.
// This function must be called before calling Process()
func SetDBSession(s mongoDB.Session) {
session = s
}
func Process() {
collection := mongoDB.CreateCollection(session, "namedatabase", "colectionData")
mongoDB.InsertData(collection, "Ale", "45646565")
}
Using this solution, you will only have to pass the session to the controller package once, letting main take care of the creating and closing of the session.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论