如何在func main()中设置数据库实例可用于其他包?

时间:2017-10-25 01:48:49

标签: go sqlite

我正在编写我的第一个go web应用程序,我有以下结构:

.
├── main.go
├── model
│   ├── model.go
│   └── book.go
├── route
│   └── route.go
└── view
    └── view.go

/main.go 是我的 main()所在的位置。在那个文件中我还定义了一个变量Env,我将保留我的数据库实例(至少这是计划)。

/main.go 我做

import "project/view"

type Env struct {
    db models.Collection
}

// rest of the code

func main() {
    db, err := models.NewDB()
    // etc
    MyEnv := &Env{db}
    // etc
}

但事实是,在 /view/view.go 中,我需要调用 /model/book.go 中定义的方法,我想是这样做的是通过 MyEnv.db 实例,但我当然得到一个错误:

view / view.go:13:14:undefined:Env

^^任何有助于解决这个问题的帮助都会受到赞赏,或者如何更好地构建我的项目。 :)

2 个答案:

答案 0 :(得分:0)

在主要

上的代码顶层定义它
var MyEnv Env

 func main(){
     MyEnv = &Env{}

  }

答案 1 :(得分:0)

如果您想使用其他套餐的名称(变量,类型等),则需要import该套餐,例如使用import "view",您可以在主程序包中执行view.Something

现在您无法导入主程序包,这意味着您的view程序包无法导入main来致电main.Env。所以你必须使用另一种方式,一些可能性是:

  1. Env类型放入view包中,然后在main包中声明var myEnv = view.Env{}

  2. Env类型放入自己的包env中,然后将其导入viewmain

  3. 您可以在Env包中使用interface类型,而不是使用具体类型view。此类型应仅公开您需要的功能。然后,您可以在main包中实施该类型,并将其实例传递给view