在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