我有一个使用 mongodb 作为后端数据库的 http 服务器,我将数据库操作包装在一个单独的文件中 (package),我不想每次都建立连接,所以我考虑制作一个global session 并像this 一样复制它也许是个好主意。所以这是到目前为止我得到的:
文件 server.go
我在其中启动了 http 服务器,我也想从这里初始化 mongodb 连接,因为我不知道其他建立连接的方法到目前为止 http 服务器的整个生命周期:-(
package main
import(
"./mylib"
"net/http"
)
...
func main(){
dbutil.MySession, err := dbutil.ConnectDb()
if err != nil {
panic(err)
}
// I will just omit the http server config code for convenience
http.HandleFunc(...)
http.HandleFunc(...)
}
...
这里是包含变量 MySession
的文件 dbutil.go
。顺便说一句,它们的总目录结构是这样的,应该没问题:
.
├── mylib
│ └── dbutil.go
└── server.go
在 dbutil.go
中:
package dbutil
import (
...
)
var MySession *mgo.Session
func ConnectDb() (*mgo.Session, error){
session, err := mgo.Dial("127.0.0.1")
if err != nil {
return nil, err
}
return session, nil
}
但是当我编译它们并运行服务器时,它会提示:
# command-line-arguments
./server.go:28: cannot declare name dbutil.MySession
我注意到如果我将 dbutil.MySession, err := dbutil.ConnectDb()
更改为 dbutil.MySession, err = dbutil.ConnectDb()
事情不会要么工作。
那么在这种情况下如何分配global 变量MySession
?还是我一开始就做错了什么(尝试使用其他文件的变量)?
最佳答案
Short variable declaration :=
创建新变量。新变量的名称不能包含包名称,但你的包含:
dbutil.MySession, err := dbutil.ConnectDb()
只是不要使用简短的变量声明:
var err error
dbutil.MySession, err = dbutil.ConnectDb()
// ...rest of your code
关于mongodb - 在go中使用和分配其他文件(包)的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28766489/