在go中使用和分配其他文件(包)的变量
Using and assign variables of other file (package) in go
我有一个使用 mongodb 作为后端数据库的 http 服务器,我将数据库操作包装在一个单独的文件中 (package),我不想要每次都建立连接,所以我认为创建一个 global 会话并像 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 作为后端数据库的 http 服务器,我将数据库操作包装在一个单独的文件中 (package),我不想要每次都建立连接,所以我认为创建一个 global 会话并像 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